commit 6686208bf1df028d1760b0b596c1acedeba80763 Author: govardhan Date: Thu Jun 19 09:01:18 2025 +0530 before changing links diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eba74f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv/ \ No newline at end of file diff --git a/clean_md_files.py b/clean_md_files.py new file mode 100644 index 0000000..21ac06f --- /dev/null +++ b/clean_md_files.py @@ -0,0 +1,38 @@ +import os +import re + +def clean_md_file(file_path): + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # Remove content before first "---" if it exists + if "---" in content: + content = re.sub(r'^.*?---', '', content, flags=re.DOTALL) + + # Remove navigation links at the bottom + content = re.sub(r'\n\[Previous\].*$', '', content, flags=re.DOTALL) + + # Remove any remaining navigation-related content at the bottom + content = re.sub(r'\n\* \[.*?\].*$', '', content, flags=re.DOTALL) + + # Clean up multiple blank lines + content = re.sub(r'\n{3,}', '\n\n', content) + + # Trim leading/trailing whitespace while preserving content + content = content.strip() + + with open(file_path, 'w', encoding='utf-8') as f: + f.write(content) + +def process_directory(dir_path): + for root, dirs, files in os.walk(dir_path): + for file in files: + if file.endswith('.md'): + file_path = os.path.join(root, file) + print(f"Processing: {file_path}") + clean_md_file(file_path) + +if __name__ == "__main__": + docs_dir = "/Users/dhanraj/Desktop/kpme_scraper/docs" + process_directory(docs_dir) + print("Completed cleaning markdown files.") diff --git a/cloudferro-docs/mkdocs.yml b/cloudferro-docs/mkdocs.yml new file mode 100644 index 0000000..e69de29 diff --git a/cloudferro-docs/mkdocs_build_analysis.md b/cloudferro-docs/mkdocs_build_analysis.md new file mode 100644 index 0000000..e69de29 diff --git a/cloudferro-docs/requirements.txt b/cloudferro-docs/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/cloudferro_docs_scraper.py b/cloudferro_docs_scraper.py new file mode 100644 index 0000000..15aa1bc --- /dev/null +++ b/cloudferro_docs_scraper.py @@ -0,0 +1,151 @@ +import requests +from bs4 import BeautifulSoup +import os +from urllib.parse import urljoin, urlparse +import time +import yaml +import markdownify + +def scrape_cloudferro_docs(base_url): + # Create project directories + project_dir = "cloudferro-docs" + docs_dir = os.path.join(project_dir, "docs") + os.makedirs(docs_dir, exist_ok=True) + + # Create project directory + project_dir = "cloudferro-docs" + docs_dir = os.path.join(project_dir, "docs") + os.makedirs(docs_dir, exist_ok=True) + + # Dictionary to store navigation structure + nav_structure = {} + visited_urls = set() + + def scrape_page(url, parent_path=""): + if url in visited_urls: + return + visited_urls.add(url) + try: + # Add delay to be respectful to the server + time.sleep(1) + response = requests.get(url) + response.raise_for_status() + + # Parse page content with BeautifulSoup + soup = BeautifulSoup(response.content, 'html.parser') + + # Extract main content (using the correct selector for CloudFerro docs) + content = soup.select_one('.rst-content .document') or soup.select_one('.document') + if not content: + print(f"No content found at {url}") + return + except Exception as e: + print(f"Error processing {url}: {str(e)}") + return + + # Convert HTML to Markdown + md_content = markdownify.markdownify(str(content), heading_style="ATX") + + # Extract page title for file name and nav + title = soup.select_one('.md-content h1') or soup.select_one('title') + page_title = (title.text.strip() if title else url.split('/')[-1]).replace(' ', '_').lower() + page_title = page_title.replace('/', '_').replace('?', '') + + # Create file path + relative_path = os.path.join(parent_path, f"{page_title}.md") + file_path = os.path.join(docs_dir, relative_path) + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + # Save Markdown content + with open(file_path, 'w', encoding='utf-8') as f: + f.write(md_content) + + # Update navigation structure + nav_path = parent_path.split('/') if parent_path else [] + current_nav = nav_structure + for part in nav_path: + for item in current_nav: + if isinstance(item, dict) and part in item: + current_nav = item[part] + break + current_nav.append({page_title.replace('_', ' ').title(): relative_path}) + + # Find and scrape linked pages (e.g., sidebar or content links) + links = content.select('a[href]') + for link in links: + href = link['href'] + if href.startswith('#') or href.startswith('mailto:') or href.startswith('javascript:'): + continue + absolute_url = urljoin(base_url, href) + if absolute_url.startswith(base_url) and absolute_url not in visited_urls: + new_parent_path = parent_path + if 'section' in link.get('class', []): # Adjust based on actual class names + new_parent_path = os.path.join(parent_path, page_title) + scrape_page(absolute_url, new_parent_path) + + # Start scraping from the base URL + try: + scrape_page(base_url) + except Exception as e: + print(f"Error during scraping: {e}") + + # Generate mkdocs.yml + mkdocs_config = { + 'site_name': 'CloudFerro Cloud Documentation', + 'site_url': 'https://your-readthedocs-subdomain.readthedocs.io', + 'theme': { + 'name': 'material', + 'palette': { + 'primary': 'blue', + 'accent': 'blue' + }, + 'features': ['content.code.copy', 'navigation.sections'] + }, + 'nav': convert_nav_structure(nav_structure), + 'markdown_extensions': [ + 'admonition', + 'pymdownx.details', + 'pymdownx.superfences' + ] + } + + with open(os.path.join(project_dir, 'mkdocs.yml'), 'w', encoding='utf-8') as f: + yaml.dump(mkdocs_config, f, allow_unicode=True) + + # Create .readthedocs.yml + readthedocs_config = { + 'version': 2, + 'build': { + 'os': 'ubuntu-24.04', + 'tools': {'python': '3.11'} + }, + 'python': { + 'install': [{'requirements': 'requirements.txt'}] + }, + 'mkdocs': {'configuration': 'mkdocs.yml'} + } + + with open(os.path.join(project_dir, '.readthedocs.yml'), 'w', encoding='utf-8') as f: + yaml.dump(readthedocs_config, f, allow_unicode=True) + + # Create requirements.txt + with open(os.path.join(project_dir, 'requirements.txt'), 'w', encoding='utf-8') as f: + f.write("mkdocs>=1.5.0\nmkdocs-material>=9.6.0\n") + + print(f"Documentation cloned to {project_dir}. Run 'mkdocs serve' to preview locally.") + print("Push to a Git repository and import to Read the Docs to host.") + +def convert_nav_structure(nav): + result = [] + for item in nav: + if isinstance(item, dict): + for key, value in item.items(): + if isinstance(value, str): + result.append({key: value}) + else: + result.append({key: convert_nav_structure(value)}) + return result + +# URL of the CloudFerro documentation +url = 'https://docs.cloudferro.com/en/latest/' +scrape_cloudferro_docs(url) \ No newline at end of file diff --git a/cloudferro_docs_scraper_new.py b/cloudferro_docs_scraper_new.py new file mode 100644 index 0000000..f48dc59 --- /dev/null +++ b/cloudferro_docs_scraper_new.py @@ -0,0 +1,169 @@ +import requests +from bs4 import BeautifulSoup +import os +from urllib.parse import urljoin, urlparse +import time +import yaml +import markdownify + +def scrape_cloudferro_docs(base_url): + """Scrape CloudFerro documentation and save as markdown files.""" + + # Create project directory + project_dir = "cloudferro-docs" + docs_dir = os.path.join(project_dir, "docs") + os.makedirs(docs_dir, exist_ok=True) + + # Keep track of visited URLs and navigation structure + visited_urls = set() + nav_structure = [] + + def clean_filename(text): + """Convert text to a clean filename""" + return text.strip().replace(' ', '_').replace('/', '_').replace('?', '').lower() + + def scrape_page(url, parent_path=""): + if url in visited_urls: + return + + visited_urls.add(url) + print(f"Scraping: {url}") + + try: + # Add delay to be respectful to the server + time.sleep(1) + response = requests.get(url) + response.raise_for_status() + + soup = BeautifulSoup(response.content, 'html.parser') + + # Extract main content + content = soup.select_one('.rst-content .document') or soup.select_one('.document') + if not content: + print(f"No content found at {url}") + return + + # Get title + title = soup.select_one('h1') + if not title: + title = soup.select_one('title') + page_title = title.text.strip() if title else url.split('/')[-1] + + # Convert content to markdown + md_content = markdownify.markdownify(str(content), heading_style="ATX") + + # Create file path + filename = clean_filename(page_title) + '.md' + relative_path = os.path.join(parent_path, filename) + file_path = os.path.join(docs_dir, relative_path) + + # Ensure directory exists + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + # Save content + with open(file_path, 'w', encoding='utf-8') as f: + f.write(f"# {page_title}\n\n") + f.write(md_content) + + print(f"Saved: {file_path}") + + # Update navigation structure + current_section = nav_structure + if parent_path: + for section in parent_path.split('/'): + if section: + section_dict = next((item for item in current_section + if isinstance(item, dict) and section in item), None) + if not section_dict: + section_dict = {section: []} + current_section.append(section_dict) + current_section = section_dict[section] + + current_section.append({page_title: relative_path}) + + # Find and process links + menu = soup.select_one('.wy-menu-vertical') + if menu: + for link in menu.select('a'): + href = link.get('href') + if not href or href.startswith(('#', 'mailto:', 'javascript:', 'tel:')): + continue + + next_url = urljoin(url, href) + if urlparse(next_url).netloc == urlparse(base_url).netloc: + parent = link.find_parent('li', class_='toctree-l2') + next_parent_path = parent_path + if parent: + section = parent.find_previous_sibling('li', class_='toctree-l1') + if section: + section_name = clean_filename(section.get_text().strip()) + next_parent_path = os.path.join(parent_path, section_name) + scrape_page(next_url, next_parent_path) + + except Exception as e: + print(f"Error processing {url}: {str(e)}") + + try: + scrape_page(base_url) + except Exception as e: + print(f"Error during scraping: {str(e)}") + + # Generate mkdocs.yml + mkdocs_config = { + 'site_name': 'CloudFerro Documentation', + 'site_description': 'CloudFerro Documentation Mirror', + 'theme': { + 'name': 'material', + 'palette': { + 'primary': 'blue', + 'accent': 'blue' + }, + 'features': [ + 'navigation.instant', + 'navigation.tracking', + 'navigation.tabs', + 'navigation.sections', + 'navigation.expand', + 'navigation.indexes', + 'toc.integrate', + 'content.code.copy' + ] + }, + 'nav': nav_structure, + 'markdown_extensions': [ + 'admonition', + 'pymdownx.details', + 'pymdownx.superfences', + 'pymdownx.highlight', + 'pymdownx.inlinehilite', + 'pymdownx.snippets', + 'pymdownx.tabbed', + 'footnotes', + 'toc', + 'tables', + 'attr_list' + ] + } + + with open(os.path.join(project_dir, 'mkdocs.yml'), 'w', encoding='utf-8') as f: + yaml.dump(mkdocs_config, f, allow_unicode=True, sort_keys=False) + + # Create requirements.txt + requirements = [ + "mkdocs>=1.5.0", + "mkdocs-material>=9.6.0", + "pymdown-extensions>=10.7", + ] + + with open(os.path.join(project_dir, 'requirements.txt'), 'w', encoding='utf-8') as f: + f.write('\n'.join(requirements)) + + print("\nScraping completed!") + print(f"Documentation has been generated in the {project_dir} directory") + print("\nTo preview the documentation locally:") + print("1. Install requirements: pip install -r cloudferro-docs/requirements.txt") + print("2. Run local server: cd cloudferro-docs && mkdocs serve") + +if __name__ == "__main__": + url = 'https://docs.cloudferro.com/en/latest/' + scrape_cloudferro_docs(url) diff --git a/docs/_images/01.png b/docs/_images/01.png new file mode 100644 index 0000000..f677f9e Binary files /dev/null and b/docs/_images/01.png differ diff --git a/docs/_images/02.png b/docs/_images/02.png new file mode 100644 index 0000000..0717ec8 Binary files /dev/null and b/docs/_images/02.png differ diff --git a/docs/_images/03.png b/docs/_images/03.png new file mode 100644 index 0000000..4197dd6 Binary files /dev/null and b/docs/_images/03.png differ diff --git a/docs/_images/04.png b/docs/_images/04.png new file mode 100644 index 0000000..a098e5f Binary files /dev/null and b/docs/_images/04.png differ diff --git a/docs/_images/05.png b/docs/_images/05.png new file mode 100644 index 0000000..ffdf3e8 Binary files /dev/null and b/docs/_images/05.png differ diff --git a/docs/_images/06.png b/docs/_images/06.png new file mode 100644 index 0000000..91d86ed Binary files /dev/null and b/docs/_images/06.png differ diff --git a/docs/_images/07.png b/docs/_images/07.png new file mode 100644 index 0000000..ba069c7 Binary files /dev/null and b/docs/_images/07.png differ diff --git a/docs/_images/08.png b/docs/_images/08.png new file mode 100644 index 0000000..db567df Binary files /dev/null and b/docs/_images/08.png differ diff --git a/docs/_images/09.png b/docs/_images/09.png new file mode 100644 index 0000000..f70c7fe Binary files /dev/null and b/docs/_images/09.png differ diff --git a/docs/_images/10.png b/docs/_images/10.png new file mode 100644 index 0000000..2586a6e Binary files /dev/null and b/docs/_images/10.png differ diff --git a/docs/_images/11.png b/docs/_images/11.png new file mode 100644 index 0000000..ebc19db Binary files /dev/null and b/docs/_images/11.png differ diff --git a/docs/_images/12.png b/docs/_images/12.png new file mode 100644 index 0000000..c6242ed Binary files /dev/null and b/docs/_images/12.png differ diff --git a/docs/_images/13.png b/docs/_images/13.png new file mode 100644 index 0000000..7fb0799 Binary files /dev/null and b/docs/_images/13.png differ diff --git a/docs/_images/14.png b/docs/_images/14.png new file mode 100644 index 0000000..6892535 Binary files /dev/null and b/docs/_images/14.png differ diff --git a/docs/_images/15.png b/docs/_images/15.png new file mode 100644 index 0000000..b842d46 Binary files /dev/null and b/docs/_images/15.png differ diff --git a/docs/_images/Screenshot_20241006_124004.png b/docs/_images/Screenshot_20241006_124004.png new file mode 100644 index 0000000..3bab1c7 Binary files /dev/null and b/docs/_images/Screenshot_20241006_124004.png differ diff --git a/docs/_images/Screenshot_20241006_125234.png b/docs/_images/Screenshot_20241006_125234.png new file mode 100644 index 0000000..8866b3f Binary files /dev/null and b/docs/_images/Screenshot_20241006_125234.png differ diff --git a/docs/_images/Screenshot_20241006_125651.png b/docs/_images/Screenshot_20241006_125651.png new file mode 100644 index 0000000..57c60ff Binary files /dev/null and b/docs/_images/Screenshot_20241006_125651.png differ diff --git a/docs/_images/Screenshot_20241006_130817.png b/docs/_images/Screenshot_20241006_130817.png new file mode 100644 index 0000000..4370c09 Binary files /dev/null and b/docs/_images/Screenshot_20241006_130817.png differ diff --git a/docs/_images/Screenshot_20241006_132113.png b/docs/_images/Screenshot_20241006_132113.png new file mode 100644 index 0000000..14ee6bf Binary files /dev/null and b/docs/_images/Screenshot_20241006_132113.png differ diff --git a/docs/_images/Screenshot_20241006_132619.png b/docs/_images/Screenshot_20241006_132619.png new file mode 100644 index 0000000..1d65097 Binary files /dev/null and b/docs/_images/Screenshot_20241006_132619.png differ diff --git a/docs/_images/Screenshot_20241006_133524.png b/docs/_images/Screenshot_20241006_133524.png new file mode 100644 index 0000000..d574320 Binary files /dev/null and b/docs/_images/Screenshot_20241006_133524.png differ diff --git a/docs/_images/Screenshot_20241006_134749.png b/docs/_images/Screenshot_20241006_134749.png new file mode 100644 index 0000000..02cbdb3 Binary files /dev/null and b/docs/_images/Screenshot_20241006_134749.png differ diff --git a/docs/_images/Screenshot_20241006_135229.png b/docs/_images/Screenshot_20241006_135229.png new file mode 100644 index 0000000..42fffb9 Binary files /dev/null and b/docs/_images/Screenshot_20241006_135229.png differ diff --git a/docs/_images/Screenshot_20241006_143434.png b/docs/_images/Screenshot_20241006_143434.png new file mode 100644 index 0000000..2d97523 Binary files /dev/null and b/docs/_images/Screenshot_20241006_143434.png differ diff --git a/docs/_images/Screenshot_20241006_145844.png b/docs/_images/Screenshot_20241006_145844.png new file mode 100644 index 0000000..ee8435f Binary files /dev/null and b/docs/_images/Screenshot_20241006_145844.png differ diff --git a/docs/_images/Tenant_manager_01_cloudferro.png b/docs/_images/Tenant_manager_01_cloudferro.png new file mode 100644 index 0000000..6b27b3d Binary files /dev/null and b/docs/_images/Tenant_manager_01_cloudferro.png differ diff --git a/docs/_images/Tenant_manager_02_cloudferro.png b/docs/_images/Tenant_manager_02_cloudferro.png new file mode 100644 index 0000000..d8b5dd6 Binary files /dev/null and b/docs/_images/Tenant_manager_02_cloudferro.png differ diff --git a/docs/_images/Tenant_manager_03_cloudferro.png b/docs/_images/Tenant_manager_03_cloudferro.png new file mode 100644 index 0000000..9b6b11b Binary files /dev/null and b/docs/_images/Tenant_manager_03_cloudferro.png differ diff --git a/docs/_images/Tenant_manager_04_cloudferro.png b/docs/_images/Tenant_manager_04_cloudferro.png new file mode 100644 index 0000000..56018c8 Binary files /dev/null and b/docs/_images/Tenant_manager_04_cloudferro.png differ diff --git a/docs/_images/Tenant_manager_05_cloudferro.png b/docs/_images/Tenant_manager_05_cloudferro.png new file mode 100644 index 0000000..9dbfcfa Binary files /dev/null and b/docs/_images/Tenant_manager_05_cloudferro.png differ diff --git a/docs/_images/a_record_in_dns.png b/docs/_images/a_record_in_dns.png new file mode 100644 index 0000000..e09eac1 Binary files /dev/null and b/docs/_images/a_record_in_dns.png differ diff --git a/docs/_images/accessvm2.png b/docs/_images/accessvm2.png new file mode 100644 index 0000000..c07f0a2 Binary files /dev/null and b/docs/_images/accessvm2.png differ diff --git a/docs/_images/accessvm3.png b/docs/_images/accessvm3.png new file mode 100644 index 0000000..edb77d5 Binary files /dev/null and b/docs/_images/accessvm3.png differ diff --git a/docs/_images/accessvm4v2.png b/docs/_images/accessvm4v2.png new file mode 100644 index 0000000..4daa2f1 Binary files /dev/null and b/docs/_images/accessvm4v2.png differ diff --git a/docs/_images/accessvm5.png b/docs/_images/accessvm5.png new file mode 100644 index 0000000..8daf791 Binary files /dev/null and b/docs/_images/accessvm5.png differ diff --git a/docs/_images/account-final.png b/docs/_images/account-final.png new file mode 100644 index 0000000..3c8cf1f Binary files /dev/null and b/docs/_images/account-final.png differ diff --git a/docs/_images/account-groups.png b/docs/_images/account-groups.png new file mode 100644 index 0000000..557b432 Binary files /dev/null and b/docs/_images/account-groups.png differ diff --git a/docs/_images/account-menu.png b/docs/_images/account-menu.png new file mode 100644 index 0000000..94d69b2 Binary files /dev/null and b/docs/_images/account-menu.png differ diff --git a/docs/_images/account-new.png b/docs/_images/account-new.png new file mode 100644 index 0000000..068a710 Binary files /dev/null and b/docs/_images/account-new.png differ diff --git a/docs/_images/account-properties.png b/docs/_images/account-properties.png new file mode 100644 index 0000000..8ea1b22 Binary files /dev/null and b/docs/_images/account-properties.png differ diff --git a/docs/_images/activate-api-2fa-01_creodias.png b/docs/_images/activate-api-2fa-01_creodias.png new file mode 100644 index 0000000..956c527 Binary files /dev/null and b/docs/_images/activate-api-2fa-01_creodias.png differ diff --git a/docs/_images/activate-api-2fa-02_creodias.png b/docs/_images/activate-api-2fa-02_creodias.png new file mode 100644 index 0000000..3e1f724 Binary files /dev/null and b/docs/_images/activate-api-2fa-02_creodias.png differ diff --git a/docs/_images/activate-api-2fa-03_creodias.png b/docs/_images/activate-api-2fa-03_creodias.png new file mode 100644 index 0000000..84ac8db Binary files /dev/null and b/docs/_images/activate-api-2fa-03_creodias.png differ diff --git a/docs/_images/activate_environment.png b/docs/_images/activate_environment.png new file mode 100644 index 0000000..b6191e3 Binary files /dev/null and b/docs/_images/activate_environment.png differ diff --git a/docs/_images/add_ticket.png b/docs/_images/add_ticket.png new file mode 100644 index 0000000..39dc506 Binary files /dev/null and b/docs/_images/add_ticket.png differ diff --git a/docs/_images/add_ticket_cloudferrocloud.png b/docs/_images/add_ticket_cloudferrocloud.png new file mode 100644 index 0000000..e1038f9 Binary files /dev/null and b/docs/_images/add_ticket_cloudferrocloud.png differ diff --git a/docs/_images/advanced_option.png b/docs/_images/advanced_option.png new file mode 100644 index 0000000..1e0f00f Binary files /dev/null and b/docs/_images/advanced_option.png differ diff --git a/docs/_images/after_delete_cluster.png b/docs/_images/after_delete_cluster.png new file mode 100644 index 0000000..a673a99 Binary files /dev/null and b/docs/_images/after_delete_cluster.png differ diff --git a/docs/_images/all_nodes.png b/docs/_images/all_nodes.png new file mode 100644 index 0000000..b49c760 Binary files /dev/null and b/docs/_images/all_nodes.png differ diff --git a/docs/_images/any_other_route.png b/docs/_images/any_other_route.png new file mode 100644 index 0000000..7832c66 Binary files /dev/null and b/docs/_images/any_other_route.png differ diff --git a/docs/_images/apache_bitnami.png b/docs/_images/apache_bitnami.png new file mode 100644 index 0000000..a37fcad Binary files /dev/null and b/docs/_images/apache_bitnami.png differ diff --git a/docs/_images/apache_ip.png b/docs/_images/apache_ip.png new file mode 100644 index 0000000..ee26810 Binary files /dev/null and b/docs/_images/apache_ip.png differ diff --git a/docs/_images/apache_route.png b/docs/_images/apache_route.png new file mode 100644 index 0000000..46ff43c Binary files /dev/null and b/docs/_images/apache_route.png differ diff --git a/docs/_images/api_access.png b/docs/_images/api_access.png new file mode 100644 index 0000000..0331557 Binary files /dev/null and b/docs/_images/api_access.png differ diff --git a/docs/_images/api_address.png b/docs/_images/api_address.png new file mode 100644 index 0000000..b23f069 Binary files /dev/null and b/docs/_images/api_address.png differ diff --git a/docs/_images/apply_yaml.png b/docs/_images/apply_yaml.png new file mode 100644 index 0000000..62d743f Binary files /dev/null and b/docs/_images/apply_yaml.png differ diff --git a/docs/_images/associate_floating_ip.png b/docs/_images/associate_floating_ip.png new file mode 100644 index 0000000..235cc1f Binary files /dev/null and b/docs/_images/associate_floating_ip.png differ diff --git a/docs/_images/auto_scaling_filled_in.png b/docs/_images/auto_scaling_filled_in.png new file mode 100644 index 0000000..7bde4df Binary files /dev/null and b/docs/_images/auto_scaling_filled_in.png differ diff --git a/docs/_images/autoscale_custom_worker.png b/docs/_images/autoscale_custom_worker.png new file mode 100644 index 0000000..dd61c45 Binary files /dev/null and b/docs/_images/autoscale_custom_worker.png differ diff --git a/docs/_images/autoscale_with_role.png b/docs/_images/autoscale_with_role.png new file mode 100644 index 0000000..9076997 Binary files /dev/null and b/docs/_images/autoscale_with_role.png differ diff --git a/docs/_images/backup-command-rotating-backups-05_creodias.png b/docs/_images/backup-command-rotating-backups-05_creodias.png new file mode 100644 index 0000000..871679d Binary files /dev/null and b/docs/_images/backup-command-rotating-backups-05_creodias.png differ diff --git a/docs/_images/backup-command-rotating-backups-06_creodias.png b/docs/_images/backup-command-rotating-backups-06_creodias.png new file mode 100644 index 0000000..559b28f Binary files /dev/null and b/docs/_images/backup-command-rotating-backups-06_creodias.png differ diff --git a/docs/_images/backup-command-rotating-backups-08_creodias.png b/docs/_images/backup-command-rotating-backups-08_creodias.png new file mode 100644 index 0000000..1ac3e26 Binary files /dev/null and b/docs/_images/backup-command-rotating-backups-08_creodias.png differ diff --git a/docs/_images/backupinst1.png b/docs/_images/backupinst1.png new file mode 100644 index 0000000..d8f38a3 Binary files /dev/null and b/docs/_images/backupinst1.png differ diff --git a/docs/_images/backupinst2.png b/docs/_images/backupinst2.png new file mode 100644 index 0000000..c0d3110 Binary files /dev/null and b/docs/_images/backupinst2.png differ diff --git a/docs/_images/backupinst3.png b/docs/_images/backupinst3.png new file mode 100644 index 0000000..f7c2112 Binary files /dev/null and b/docs/_images/backupinst3.png differ diff --git a/docs/_images/backupinst4.png b/docs/_images/backupinst4.png new file mode 100644 index 0000000..bfa259f Binary files /dev/null and b/docs/_images/backupinst4.png differ diff --git a/docs/_images/backupinst5.png b/docs/_images/backupinst5.png new file mode 100644 index 0000000..345add2 Binary files /dev/null and b/docs/_images/backupinst5.png differ diff --git a/docs/_images/boot_source.png b/docs/_images/boot_source.png new file mode 100644 index 0000000..61a25e5 Binary files /dev/null and b/docs/_images/boot_source.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-01_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-01_creodias.png new file mode 100644 index 0000000..e80bdaa Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-01_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-02_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-02_creodias.png new file mode 100644 index 0000000..8eb8f98 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-02_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-03_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-03_creodias.png new file mode 100644 index 0000000..11b2e30 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-03_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-04_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-04_creodias.png new file mode 100644 index 0000000..3c9e4a5 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-04_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-05_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-05_creodias.png new file mode 100644 index 0000000..5b27e8e Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-05_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-06_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-06_creodias.png new file mode 100644 index 0000000..7bac119 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-06_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-07_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-07_creodias.png new file mode 100644 index 0000000..50c2432 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-07_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-08_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-08_creodias.png new file mode 100644 index 0000000..74be3c2 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-08_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-09_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-09_creodias.png new file mode 100644 index 0000000..00aeca0 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-09_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-10_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-10_creodias.png new file mode 100644 index 0000000..703a7c7 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-10_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-11_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-11_creodias.png new file mode 100644 index 0000000..0f27030 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-11_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-12_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-12_creodias.png new file mode 100644 index 0000000..bfb24cd Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-12_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-13_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-13_creodias.png new file mode 100644 index 0000000..f3974c0 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-13_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-14_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-14_creodias.png new file mode 100644 index 0000000..8228eb8 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-14_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-16_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-16_creodias.png new file mode 100644 index 0000000..e60072d Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-16_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-21_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-21_creodias.png new file mode 100644 index 0000000..b8f4f47 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-21_creodias.png differ diff --git a/docs/_images/bootable-versus-nonbootable-volume-22_creodias.png b/docs/_images/bootable-versus-nonbootable-volume-22_creodias.png new file mode 100644 index 0000000..e9789f2 Binary files /dev/null and b/docs/_images/bootable-versus-nonbootable-volume-22_creodias.png differ diff --git a/docs/_images/boto1.png b/docs/_images/boto1.png new file mode 100644 index 0000000..f239d2f Binary files /dev/null and b/docs/_images/boto1.png differ diff --git a/docs/_images/boto2.png b/docs/_images/boto2.png new file mode 100644 index 0000000..f469be0 Binary files /dev/null and b/docs/_images/boto2.png differ diff --git a/docs/_images/boto3.png b/docs/_images/boto3.png new file mode 100644 index 0000000..ddd77a6 Binary files /dev/null and b/docs/_images/boto3.png differ diff --git a/docs/_images/boto4.png b/docs/_images/boto4.png new file mode 100644 index 0000000..69d9acb Binary files /dev/null and b/docs/_images/boto4.png differ diff --git a/docs/_images/bucketnew_created.png b/docs/_images/bucketnew_created.png new file mode 100644 index 0000000..2023320 Binary files /dev/null and b/docs/_images/bucketnew_created.png differ diff --git a/docs/_images/c1.png b/docs/_images/c1.png new file mode 100644 index 0000000..44e0c50 Binary files /dev/null and b/docs/_images/c1.png differ diff --git a/docs/_images/c4.png b/docs/_images/c4.png new file mode 100644 index 0000000..0c7ca9f Binary files /dev/null and b/docs/_images/c4.png differ diff --git a/docs/_images/choose_os.png b/docs/_images/choose_os.png new file mode 100644 index 0000000..33ac6e3 Binary files /dev/null and b/docs/_images/choose_os.png differ diff --git a/docs/_images/cli_newcluster.png b/docs/_images/cli_newcluster.png new file mode 100644 index 0000000..5595574 Binary files /dev/null and b/docs/_images/cli_newcluster.png differ diff --git a/docs/_images/cli_os_cloud.png b/docs/_images/cli_os_cloud.png new file mode 100644 index 0000000..205173f Binary files /dev/null and b/docs/_images/cli_os_cloud.png differ diff --git a/docs/_images/click_button_launch_stack.png b/docs/_images/click_button_launch_stack.png new file mode 100644 index 0000000..9a59f5b Binary files /dev/null and b/docs/_images/click_button_launch_stack.png differ diff --git a/docs/_images/click_on_email.png b/docs/_images/click_on_email.png new file mode 100644 index 0000000..fcc7f30 Binary files /dev/null and b/docs/_images/click_on_email.png differ diff --git a/docs/_images/clone2.png b/docs/_images/clone2.png new file mode 100644 index 0000000..907f8a5 Binary files /dev/null and b/docs/_images/clone2.png differ diff --git a/docs/_images/clone3.png b/docs/_images/clone3.png new file mode 100644 index 0000000..511cfa4 Binary files /dev/null and b/docs/_images/clone3.png differ diff --git a/docs/_images/cloudferro-logo.png b/docs/_images/cloudferro-logo.png new file mode 100644 index 0000000..9e62d1c Binary files /dev/null and b/docs/_images/cloudferro-logo.png differ diff --git a/docs/_images/cloudferro_cloud_1.png b/docs/_images/cloudferro_cloud_1.png new file mode 100644 index 0000000..3ba756c Binary files /dev/null and b/docs/_images/cloudferro_cloud_1.png differ diff --git a/docs/_images/cloudferro_cloud_10.png b/docs/_images/cloudferro_cloud_10.png new file mode 100644 index 0000000..675fbbf Binary files /dev/null and b/docs/_images/cloudferro_cloud_10.png differ diff --git a/docs/_images/cloudferro_cloud_11.png b/docs/_images/cloudferro_cloud_11.png new file mode 100644 index 0000000..4197300 Binary files /dev/null and b/docs/_images/cloudferro_cloud_11.png differ diff --git a/docs/_images/cloudferro_cloud_2.png b/docs/_images/cloudferro_cloud_2.png new file mode 100644 index 0000000..cf0583d Binary files /dev/null and b/docs/_images/cloudferro_cloud_2.png differ diff --git a/docs/_images/cloudferro_cloud_3.png b/docs/_images/cloudferro_cloud_3.png new file mode 100644 index 0000000..31059f3 Binary files /dev/null and b/docs/_images/cloudferro_cloud_3.png differ diff --git a/docs/_images/cloudferro_cloud_5.png b/docs/_images/cloudferro_cloud_5.png new file mode 100644 index 0000000..a0fa606 Binary files /dev/null and b/docs/_images/cloudferro_cloud_5.png differ diff --git a/docs/_images/cloudferro_cloud_6.png b/docs/_images/cloudferro_cloud_6.png new file mode 100644 index 0000000..c69e2ad Binary files /dev/null and b/docs/_images/cloudferro_cloud_6.png differ diff --git a/docs/_images/cloudferro_cloud_7.png b/docs/_images/cloudferro_cloud_7.png new file mode 100644 index 0000000..d474b73 Binary files /dev/null and b/docs/_images/cloudferro_cloud_7.png differ diff --git a/docs/_images/cloudferro_cloud_8.png b/docs/_images/cloudferro_cloud_8.png new file mode 100644 index 0000000..2f9f98d Binary files /dev/null and b/docs/_images/cloudferro_cloud_8.png differ diff --git a/docs/_images/cloudferro_cloud_9.png b/docs/_images/cloudferro_cloud_9.png new file mode 100644 index 0000000..85e79d7 Binary files /dev/null and b/docs/_images/cloudferro_cloud_9.png differ diff --git a/docs/_images/cluster_config_editor.png b/docs/_images/cluster_config_editor.png new file mode 100644 index 0000000..2a120d0 Binary files /dev/null and b/docs/_images/cluster_config_editor.png differ diff --git a/docs/_images/cluster_forming.png b/docs/_images/cluster_forming.png new file mode 100644 index 0000000..ee17eba Binary files /dev/null and b/docs/_images/cluster_forming.png differ diff --git a/docs/_images/cluster_inside.png b/docs/_images/cluster_inside.png new file mode 100644 index 0000000..7ca0d61 Binary files /dev/null and b/docs/_images/cluster_inside.png differ diff --git a/docs/_images/cluster_list_horizon.png b/docs/_images/cluster_list_horizon.png new file mode 100644 index 0000000..5e6e6bf Binary files /dev/null and b/docs/_images/cluster_list_horizon.png differ diff --git a/docs/_images/cluster_name_filled_in.png b/docs/_images/cluster_name_filled_in.png new file mode 100644 index 0000000..bcb316e Binary files /dev/null and b/docs/_images/cluster_name_filled_in.png differ diff --git a/docs/_images/cluster_size_new.png b/docs/_images/cluster_size_new.png new file mode 100644 index 0000000..4c8af94 Binary files /dev/null and b/docs/_images/cluster_size_new.png differ diff --git a/docs/_images/cluster_successful.png b/docs/_images/cluster_successful.png new file mode 100644 index 0000000..77fb5fe Binary files /dev/null and b/docs/_images/cluster_successful.png differ diff --git a/docs/_images/cluster_template_detail2.png b/docs/_images/cluster_template_detail2.png new file mode 100644 index 0000000..cd4568b Binary files /dev/null and b/docs/_images/cluster_template_detail2.png differ diff --git a/docs/_images/clusters.png b/docs/_images/clusters.png new file mode 100644 index 0000000..e0edb15 Binary files /dev/null and b/docs/_images/clusters.png differ diff --git a/docs/_images/clusters_command.png b/docs/_images/clusters_command.png new file mode 100644 index 0000000..c9204d1 Binary files /dev/null and b/docs/_images/clusters_command.png differ diff --git a/docs/_images/code_structure.png b/docs/_images/code_structure.png new file mode 100644 index 0000000..be5fbfe Binary files /dev/null and b/docs/_images/code_structure.png differ diff --git a/docs/_images/combination_swift_commands.png b/docs/_images/combination_swift_commands.png new file mode 100644 index 0000000..8919230 Binary files /dev/null and b/docs/_images/combination_swift_commands.png differ diff --git a/docs/_images/complete_example.png b/docs/_images/complete_example.png new file mode 100644 index 0000000..0a2e31c Binary files /dev/null and b/docs/_images/complete_example.png differ diff --git a/docs/_images/compute_instances.png b/docs/_images/compute_instances.png new file mode 100644 index 0000000..f096700 Binary files /dev/null and b/docs/_images/compute_instances.png differ diff --git a/docs/_images/confi_created.png b/docs/_images/confi_created.png new file mode 100644 index 0000000..3b4d28d Binary files /dev/null and b/docs/_images/confi_created.png differ diff --git a/docs/_images/conn01.png b/docs/_images/conn01.png new file mode 100644 index 0000000..fe27d7a Binary files /dev/null and b/docs/_images/conn01.png differ diff --git a/docs/_images/conn02b.png b/docs/_images/conn02b.png new file mode 100644 index 0000000..b380c2e Binary files /dev/null and b/docs/_images/conn02b.png differ diff --git a/docs/_images/conn03b.png b/docs/_images/conn03b.png new file mode 100644 index 0000000..3b80c89 Binary files /dev/null and b/docs/_images/conn03b.png differ diff --git a/docs/_images/conn04b.png b/docs/_images/conn04b.png new file mode 100644 index 0000000..846396d Binary files /dev/null and b/docs/_images/conn04b.png differ diff --git a/docs/_images/conn05b.png b/docs/_images/conn05b.png new file mode 100644 index 0000000..11bef88 Binary files /dev/null and b/docs/_images/conn05b.png differ diff --git a/docs/_images/conn06b.png b/docs/_images/conn06b.png new file mode 100644 index 0000000..9478481 Binary files /dev/null and b/docs/_images/conn06b.png differ diff --git a/docs/_images/conn07b.png b/docs/_images/conn07b.png new file mode 100644 index 0000000..1600e0b Binary files /dev/null and b/docs/_images/conn07b.png differ diff --git a/docs/_images/conn08b.png b/docs/_images/conn08b.png new file mode 100644 index 0000000..acae0db Binary files /dev/null and b/docs/_images/conn08b.png differ diff --git a/docs/_images/conn09b.png b/docs/_images/conn09b.png new file mode 100644 index 0000000..d60f6a5 Binary files /dev/null and b/docs/_images/conn09b.png differ diff --git a/docs/_images/conn10b.png b/docs/_images/conn10b.png new file mode 100644 index 0000000..1703388 Binary files /dev/null and b/docs/_images/conn10b.png differ diff --git a/docs/_images/conn11.png b/docs/_images/conn11.png new file mode 100644 index 0000000..99b1d98 Binary files /dev/null and b/docs/_images/conn11.png differ diff --git a/docs/_images/conn11b.png b/docs/_images/conn11b.png new file mode 100644 index 0000000..f935fd1 Binary files /dev/null and b/docs/_images/conn11b.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-1.png b/docs/_images/cookie-consent-cloudferro-cloud-1.png new file mode 100644 index 0000000..1b43c1f Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-1.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-11.png b/docs/_images/cookie-consent-cloudferro-cloud-11.png new file mode 100644 index 0000000..b6c3b27 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-11.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-12.png b/docs/_images/cookie-consent-cloudferro-cloud-12.png new file mode 100644 index 0000000..ce90d09 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-12.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-13.png b/docs/_images/cookie-consent-cloudferro-cloud-13.png new file mode 100644 index 0000000..7e5f8fb Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-13.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-15.png b/docs/_images/cookie-consent-cloudferro-cloud-15.png new file mode 100644 index 0000000..54f9135 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-15.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-2.png b/docs/_images/cookie-consent-cloudferro-cloud-2.png new file mode 100644 index 0000000..2670a86 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-2.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-4.png b/docs/_images/cookie-consent-cloudferro-cloud-4.png new file mode 100644 index 0000000..1a97e0a Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-4.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-5.png b/docs/_images/cookie-consent-cloudferro-cloud-5.png new file mode 100644 index 0000000..9dc0272 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-5.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-6.png b/docs/_images/cookie-consent-cloudferro-cloud-6.png new file mode 100644 index 0000000..aefd922 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-6.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-7.png b/docs/_images/cookie-consent-cloudferro-cloud-7.png new file mode 100644 index 0000000..997bab8 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-7.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-8.png b/docs/_images/cookie-consent-cloudferro-cloud-8.png new file mode 100644 index 0000000..24b6006 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-8.png differ diff --git a/docs/_images/cookie-consent-cloudferro-cloud-9.png b/docs/_images/cookie-consent-cloudferro-cloud-9.png new file mode 100644 index 0000000..9df7b04 Binary files /dev/null and b/docs/_images/cookie-consent-cloudferro-cloud-9.png differ diff --git a/docs/_images/cookie-consent-for-site-1.png b/docs/_images/cookie-consent-for-site-1.png new file mode 100644 index 0000000..ad30d49 Binary files /dev/null and b/docs/_images/cookie-consent-for-site-1.png differ diff --git a/docs/_images/copy.png b/docs/_images/copy.png new file mode 100644 index 0000000..4fb11bb Binary files /dev/null and b/docs/_images/copy.png differ diff --git a/docs/_images/create-linux-linux-04_creodias.png b/docs/_images/create-linux-linux-04_creodias.png new file mode 100644 index 0000000..d628fbd Binary files /dev/null and b/docs/_images/create-linux-linux-04_creodias.png differ diff --git a/docs/_images/create-linux-linux-05_creodias.png b/docs/_images/create-linux-linux-05_creodias.png new file mode 100644 index 0000000..8eee648 Binary files /dev/null and b/docs/_images/create-linux-linux-05_creodias.png differ diff --git a/docs/_images/create-linux-linux-06_creodias.png b/docs/_images/create-linux-linux-06_creodias.png new file mode 100644 index 0000000..0a458be Binary files /dev/null and b/docs/_images/create-linux-linux-06_creodias.png differ diff --git a/docs/_images/create-linux-linux-07_creodias.png b/docs/_images/create-linux-linux-07_creodias.png new file mode 100644 index 0000000..9e48dd4 Binary files /dev/null and b/docs/_images/create-linux-linux-07_creodias.png differ diff --git a/docs/_images/create-linux-linux-08_creodias.png b/docs/_images/create-linux-linux-08_creodias.png new file mode 100644 index 0000000..8ae2d71 Binary files /dev/null and b/docs/_images/create-linux-linux-08_creodias.png differ diff --git a/docs/_images/create-linux-linux-09_creodias.png b/docs/_images/create-linux-linux-09_creodias.png new file mode 100644 index 0000000..9556f7a Binary files /dev/null and b/docs/_images/create-linux-linux-09_creodias.png differ diff --git a/docs/_images/create-linux-linux-10_creodias.png b/docs/_images/create-linux-linux-10_creodias.png new file mode 100644 index 0000000..c8c1cf2 Binary files /dev/null and b/docs/_images/create-linux-linux-10_creodias.png differ diff --git a/docs/_images/create-linux-linux-12_creodias.png b/docs/_images/create-linux-linux-12_creodias.png new file mode 100644 index 0000000..e2b060d Binary files /dev/null and b/docs/_images/create-linux-linux-12_creodias.png differ diff --git a/docs/_images/create-linux-linux-13_creodias.png b/docs/_images/create-linux-linux-13_creodias.png new file mode 100644 index 0000000..88993d9 Binary files /dev/null and b/docs/_images/create-linux-linux-13_creodias.png differ diff --git a/docs/_images/create-volume-windows-01_creodias.png b/docs/_images/create-volume-windows-01_creodias.png new file mode 100644 index 0000000..3808823 Binary files /dev/null and b/docs/_images/create-volume-windows-01_creodias.png differ diff --git a/docs/_images/create-volume-windows-02_creodias.png b/docs/_images/create-volume-windows-02_creodias.png new file mode 100644 index 0000000..d3e4edc Binary files /dev/null and b/docs/_images/create-volume-windows-02_creodias.png differ diff --git a/docs/_images/create-volume-windows-03_creodias.png b/docs/_images/create-volume-windows-03_creodias.png new file mode 100644 index 0000000..2ef4986 Binary files /dev/null and b/docs/_images/create-volume-windows-03_creodias.png differ diff --git a/docs/_images/create-volume-windows-04_creodias.png b/docs/_images/create-volume-windows-04_creodias.png new file mode 100644 index 0000000..5f09824 Binary files /dev/null and b/docs/_images/create-volume-windows-04_creodias.png differ diff --git a/docs/_images/create-volume-windows-05_creodias.png b/docs/_images/create-volume-windows-05_creodias.png new file mode 100644 index 0000000..c6bf35f Binary files /dev/null and b/docs/_images/create-volume-windows-05_creodias.png differ diff --git a/docs/_images/create-volume-windows-06_creodias.png b/docs/_images/create-volume-windows-06_creodias.png new file mode 100644 index 0000000..6219002 Binary files /dev/null and b/docs/_images/create-volume-windows-06_creodias.png differ diff --git a/docs/_images/create-volume-windows-07_creodias.png b/docs/_images/create-volume-windows-07_creodias.png new file mode 100644 index 0000000..cdfad9b Binary files /dev/null and b/docs/_images/create-volume-windows-07_creodias.png differ diff --git a/docs/_images/create-volume-windows-08_creodias.png b/docs/_images/create-volume-windows-08_creodias.png new file mode 100644 index 0000000..1ee2d3d Binary files /dev/null and b/docs/_images/create-volume-windows-08_creodias.png differ diff --git a/docs/_images/create-volume-windows-09_creodias.png b/docs/_images/create-volume-windows-09_creodias.png new file mode 100644 index 0000000..4d80ac3 Binary files /dev/null and b/docs/_images/create-volume-windows-09_creodias.png differ diff --git a/docs/_images/create-volume-windows-10_creodias.png b/docs/_images/create-volume-windows-10_creodias.png new file mode 100644 index 0000000..cbffeea Binary files /dev/null and b/docs/_images/create-volume-windows-10_creodias.png differ diff --git a/docs/_images/create-volume-windows-11_creodias.png b/docs/_images/create-volume-windows-11_creodias.png new file mode 100644 index 0000000..3aaa67d Binary files /dev/null and b/docs/_images/create-volume-windows-11_creodias.png differ diff --git a/docs/_images/create-volume-windows-12_creodias.png b/docs/_images/create-volume-windows-12_creodias.png new file mode 100644 index 0000000..ef72bcc Binary files /dev/null and b/docs/_images/create-volume-windows-12_creodias.png differ diff --git a/docs/_images/create-volume-windows-13_creodias.png b/docs/_images/create-volume-windows-13_creodias.png new file mode 100644 index 0000000..06108c3 Binary files /dev/null and b/docs/_images/create-volume-windows-13_creodias.png differ diff --git a/docs/_images/create-volume-windows-14_creodias.png b/docs/_images/create-volume-windows-14_creodias.png new file mode 100644 index 0000000..525797f Binary files /dev/null and b/docs/_images/create-volume-windows-14_creodias.png differ diff --git a/docs/_images/create-volume-windows-15_creodias.png b/docs/_images/create-volume-windows-15_creodias.png new file mode 100644 index 0000000..17456ca Binary files /dev/null and b/docs/_images/create-volume-windows-15_creodias.png differ diff --git a/docs/_images/create-volume-windows-16_creodias.png b/docs/_images/create-volume-windows-16_creodias.png new file mode 100644 index 0000000..277660b Binary files /dev/null and b/docs/_images/create-volume-windows-16_creodias.png differ diff --git a/docs/_images/create-volume-windows-17_creodias.png b/docs/_images/create-volume-windows-17_creodias.png new file mode 100644 index 0000000..155eb5f Binary files /dev/null and b/docs/_images/create-volume-windows-17_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-01_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-01_creodias.png new file mode 100644 index 0000000..113d0d1 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-01_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-02_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-02_creodias.png new file mode 100644 index 0000000..90da4fb Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-02_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-03_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-03_creodias.png new file mode 100644 index 0000000..11ffeb4 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-03_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-04_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-04_creodias.png new file mode 100644 index 0000000..7206371 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-04_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-05_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-05_creodias.png new file mode 100644 index 0000000..aa49961 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-05_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-06_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-06_creodias.png new file mode 100644 index 0000000..8e4bf68 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-06_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-07_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-07_creodias.png new file mode 100644 index 0000000..ff3296e Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-07_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-09_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-09_creodias.png new file mode 100644 index 0000000..b9423b8 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-09_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-10_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-10_creodias.png new file mode 100644 index 0000000..e69bd12 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-10_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-11_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-11_creodias.png new file mode 100644 index 0000000..0f3f371 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-11_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-12_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-12_creodias.png new file mode 100644 index 0000000..6b78c08 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-12_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-13_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-13_creodias.png new file mode 100644 index 0000000..e3c72c4 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-13_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-14_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-14_creodias.png new file mode 100644 index 0000000..148a3e6 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-14_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-15_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-15_creodias.png new file mode 100644 index 0000000..ceea4d7 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-15_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-16_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-16_creodias.png new file mode 100644 index 0000000..0fb1d29 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-16_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-17_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-17_creodias.png new file mode 100644 index 0000000..8d99f73 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-17_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-18_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-18_creodias.png new file mode 100644 index 0000000..4660663 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-18_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-19_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-19_creodias.png new file mode 100644 index 0000000..20be437 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-19_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-21_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-21_creodias.png new file mode 100644 index 0000000..7fab87c Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-21_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-23_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-23_creodias.png new file mode 100644 index 0000000..401c671 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-23_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-24_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-24_creodias.png new file mode 100644 index 0000000..9376e53 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-24_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-25_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-25_creodias.png new file mode 100644 index 0000000..6e9431e Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-25_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-26_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-26_creodias.png new file mode 100644 index 0000000..c68bc71 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-26_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-27_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-27_creodias.png new file mode 100644 index 0000000..90ddec8 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-27_creodias.png differ diff --git a/docs/_images/create-windows-vm-horizon-web-console-28_creodias.png b/docs/_images/create-windows-vm-horizon-web-console-28_creodias.png new file mode 100644 index 0000000..353df17 Binary files /dev/null and b/docs/_images/create-windows-vm-horizon-web-console-28_creodias.png differ diff --git a/docs/_images/create_account_cloudferrocloud.png b/docs/_images/create_account_cloudferrocloud.png new file mode 100644 index 0000000..64a2b12 Binary files /dev/null and b/docs/_images/create_account_cloudferrocloud.png differ diff --git a/docs/_images/create_client_with_authentication.png b/docs/_images/create_client_with_authentication.png new file mode 100644 index 0000000..6599ba1 Binary files /dev/null and b/docs/_images/create_client_with_authentication.png differ diff --git a/docs/_images/create_cluster_advanced.png b/docs/_images/create_cluster_advanced.png new file mode 100644 index 0000000..790adad Binary files /dev/null and b/docs/_images/create_cluster_advanced.png differ diff --git a/docs/_images/create_cluster_details.png b/docs/_images/create_cluster_details.png new file mode 100644 index 0000000..145e275 Binary files /dev/null and b/docs/_images/create_cluster_details.png differ diff --git a/docs/_images/create_cluster_size.png b/docs/_images/create_cluster_size.png new file mode 100644 index 0000000..8485f20 Binary files /dev/null and b/docs/_images/create_cluster_size.png differ diff --git a/docs/_images/create_cluster_working.png b/docs/_images/create_cluster_working.png new file mode 100644 index 0000000..1283f25 Binary files /dev/null and b/docs/_images/create_cluster_working.png differ diff --git a/docs/_images/create_credential.png b/docs/_images/create_credential.png new file mode 100644 index 0000000..2ffebde Binary files /dev/null and b/docs/_images/create_credential.png differ diff --git a/docs/_images/create_heat_4.png b/docs/_images/create_heat_4.png new file mode 100644 index 0000000..f2b59dc Binary files /dev/null and b/docs/_images/create_heat_4.png differ diff --git a/docs/_images/create_main_site_dns.png b/docs/_images/create_main_site_dns.png new file mode 100644 index 0000000..02b72a8 Binary files /dev/null and b/docs/_images/create_main_site_dns.png differ diff --git a/docs/_images/create_new_cluster.png b/docs/_images/create_new_cluster.png new file mode 100644 index 0000000..e646670 Binary files /dev/null and b/docs/_images/create_new_cluster.png differ diff --git a/docs/_images/create_new_cluster_filled_in2.png b/docs/_images/create_new_cluster_filled_in2.png new file mode 100644 index 0000000..7b994d6 Binary files /dev/null and b/docs/_images/create_new_cluster_filled_in2.png differ diff --git a/docs/_images/create_new_template.png b/docs/_images/create_new_template.png new file mode 100644 index 0000000..b3d144d Binary files /dev/null and b/docs/_images/create_new_template.png differ diff --git a/docs/_images/create_new_with_name.png b/docs/_images/create_new_with_name.png new file mode 100644 index 0000000..b5a074c Binary files /dev/null and b/docs/_images/create_new_with_name.png differ diff --git a/docs/_images/create_object_container.png b/docs/_images/create_object_container.png new file mode 100644 index 0000000..4b4d75d Binary files /dev/null and b/docs/_images/create_object_container.png differ diff --git a/docs/_images/create_project.png b/docs/_images/create_project.png new file mode 100644 index 0000000..0d2341e Binary files /dev/null and b/docs/_images/create_project.png differ diff --git a/docs/_images/create_ssh_key_windows_11-03_creodias.png b/docs/_images/create_ssh_key_windows_11-03_creodias.png new file mode 100644 index 0000000..82bc103 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-03_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-04_creodias.png b/docs/_images/create_ssh_key_windows_11-04_creodias.png new file mode 100644 index 0000000..b79d005 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-04_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-07_creodias.png b/docs/_images/create_ssh_key_windows_11-07_creodias.png new file mode 100644 index 0000000..60ba750 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-07_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-08_creodias.png b/docs/_images/create_ssh_key_windows_11-08_creodias.png new file mode 100644 index 0000000..02045e6 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-08_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-09_creodias.png b/docs/_images/create_ssh_key_windows_11-09_creodias.png new file mode 100644 index 0000000..79de078 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-09_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-10_creodias.png b/docs/_images/create_ssh_key_windows_11-10_creodias.png new file mode 100644 index 0000000..9c8f37f Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-10_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-11_creodias.png b/docs/_images/create_ssh_key_windows_11-11_creodias.png new file mode 100644 index 0000000..88035c7 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-11_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-12_creodias.png b/docs/_images/create_ssh_key_windows_11-12_creodias.png new file mode 100644 index 0000000..081c588 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-12_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-13_creodias.png b/docs/_images/create_ssh_key_windows_11-13_creodias.png new file mode 100644 index 0000000..aa7e742 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-13_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-14_creodias.png b/docs/_images/create_ssh_key_windows_11-14_creodias.png new file mode 100644 index 0000000..869a4c1 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-14_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-15_creodias.png b/docs/_images/create_ssh_key_windows_11-15_creodias.png new file mode 100644 index 0000000..82666ed Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-15_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-16_creodias.png b/docs/_images/create_ssh_key_windows_11-16_creodias.png new file mode 100644 index 0000000..d2be3a3 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-16_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-19_creodias.png b/docs/_images/create_ssh_key_windows_11-19_creodias.png new file mode 100644 index 0000000..03f9e82 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-19_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-20_creodias.png b/docs/_images/create_ssh_key_windows_11-20_creodias.png new file mode 100644 index 0000000..2c349c0 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-20_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-21_creodias.png b/docs/_images/create_ssh_key_windows_11-21_creodias.png new file mode 100644 index 0000000..882bb9a Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-21_creodias.png differ diff --git a/docs/_images/create_ssh_key_windows_11-22_creodias.png b/docs/_images/create_ssh_key_windows_11-22_creodias.png new file mode 100644 index 0000000..15805d3 Binary files /dev/null and b/docs/_images/create_ssh_key_windows_11-22_creodias.png differ diff --git a/docs/_images/create_vm_cli_1.png b/docs/_images/create_vm_cli_1.png new file mode 100644 index 0000000..066a98d Binary files /dev/null and b/docs/_images/create_vm_cli_1.png differ diff --git a/docs/_images/create_www_subdomain.png b/docs/_images/create_www_subdomain.png new file mode 100644 index 0000000..33e8c5c Binary files /dev/null and b/docs/_images/create_www_subdomain.png differ diff --git a/docs/_images/created_instances.png b/docs/_images/created_instances.png new file mode 100644 index 0000000..acda912 Binary files /dev/null and b/docs/_images/created_instances.png differ diff --git a/docs/_images/created_new_nodegroup.png b/docs/_images/created_new_nodegroup.png new file mode 100644 index 0000000..6f9879c Binary files /dev/null and b/docs/_images/created_new_nodegroup.png differ diff --git a/docs/_images/createnew10.png b/docs/_images/createnew10.png new file mode 100644 index 0000000..19a08d7 Binary files /dev/null and b/docs/_images/createnew10.png differ diff --git a/docs/_images/createnew11.png b/docs/_images/createnew11.png new file mode 100644 index 0000000..67f9a02 Binary files /dev/null and b/docs/_images/createnew11.png differ diff --git a/docs/_images/createnew12.png b/docs/_images/createnew12.png new file mode 100644 index 0000000..5713889 Binary files /dev/null and b/docs/_images/createnew12.png differ diff --git a/docs/_images/createnew13.png b/docs/_images/createnew13.png new file mode 100644 index 0000000..66cff3c Binary files /dev/null and b/docs/_images/createnew13.png differ diff --git a/docs/_images/createnew14.png b/docs/_images/createnew14.png new file mode 100644 index 0000000..63f80de Binary files /dev/null and b/docs/_images/createnew14.png differ diff --git a/docs/_images/createnew16.png b/docs/_images/createnew16.png new file mode 100644 index 0000000..3f0428f Binary files /dev/null and b/docs/_images/createnew16.png differ diff --git a/docs/_images/createnew18.png b/docs/_images/createnew18.png new file mode 100644 index 0000000..193cfbe Binary files /dev/null and b/docs/_images/createnew18.png differ diff --git a/docs/_images/createnew19.png b/docs/_images/createnew19.png new file mode 100644 index 0000000..f13518d Binary files /dev/null and b/docs/_images/createnew19.png differ diff --git a/docs/_images/createnew6.png b/docs/_images/createnew6.png new file mode 100644 index 0000000..2a61f81 Binary files /dev/null and b/docs/_images/createnew6.png differ diff --git a/docs/_images/createnew7.png b/docs/_images/createnew7.png new file mode 100644 index 0000000..f4b6db2 Binary files /dev/null and b/docs/_images/createnew7.png differ diff --git a/docs/_images/createnew8.png b/docs/_images/createnew8.png new file mode 100644 index 0000000..559d1e9 Binary files /dev/null and b/docs/_images/createnew8.png differ diff --git a/docs/_images/createnew9.png b/docs/_images/createnew9.png new file mode 100644 index 0000000..7168fb6 Binary files /dev/null and b/docs/_images/createnew9.png differ diff --git a/docs/_images/creation_in_progress2.png b/docs/_images/creation_in_progress2.png new file mode 100644 index 0000000..514883b Binary files /dev/null and b/docs/_images/creation_in_progress2.png differ diff --git a/docs/_images/credential_create_help.png b/docs/_images/credential_create_help.png new file mode 100644 index 0000000..5db56eb Binary files /dev/null and b/docs/_images/credential_create_help.png differ diff --git a/docs/_images/credentials_first_time.png b/docs/_images/credentials_first_time.png new file mode 100644 index 0000000..e03ddd2 Binary files /dev/null and b/docs/_images/credentials_first_time.png differ diff --git a/docs/_images/customize_the_cloud.png b/docs/_images/customize_the_cloud.png new file mode 100644 index 0000000..6fe23f8 Binary files /dev/null and b/docs/_images/customize_the_cloud.png differ diff --git a/docs/_images/daemonset_01.png b/docs/_images/daemonset_01.png new file mode 100644 index 0000000..711c9a2 Binary files /dev/null and b/docs/_images/daemonset_01.png differ diff --git a/docs/_images/dashboard-services-10-cloudferro-cloud.png b/docs/_images/dashboard-services-10-cloudferro-cloud.png new file mode 100644 index 0000000..6523bf2 Binary files /dev/null and b/docs/_images/dashboard-services-10-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-2-cloudferro-cloud.png b/docs/_images/dashboard-services-2-cloudferro-cloud.png new file mode 100644 index 0000000..1ac2ae8 Binary files /dev/null and b/docs/_images/dashboard-services-2-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-3-cloudferro-cloud.png b/docs/_images/dashboard-services-3-cloudferro-cloud.png new file mode 100644 index 0000000..11ceca0 Binary files /dev/null and b/docs/_images/dashboard-services-3-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-4-cloudferro-cloud.png b/docs/_images/dashboard-services-4-cloudferro-cloud.png new file mode 100644 index 0000000..9c7e49c Binary files /dev/null and b/docs/_images/dashboard-services-4-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-5-cloudferro-cloud.png b/docs/_images/dashboard-services-5-cloudferro-cloud.png new file mode 100644 index 0000000..220808f Binary files /dev/null and b/docs/_images/dashboard-services-5-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-6-cloudferro-cloud.png b/docs/_images/dashboard-services-6-cloudferro-cloud.png new file mode 100644 index 0000000..4747ec7 Binary files /dev/null and b/docs/_images/dashboard-services-6-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-7-cloudferro-cloud.png b/docs/_images/dashboard-services-7-cloudferro-cloud.png new file mode 100644 index 0000000..0e1aebe Binary files /dev/null and b/docs/_images/dashboard-services-7-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard-services-9-cloudferro-cloud.png b/docs/_images/dashboard-services-9-cloudferro-cloud.png new file mode 100644 index 0000000..a3a23da Binary files /dev/null and b/docs/_images/dashboard-services-9-cloudferro-cloud.png differ diff --git a/docs/_images/dashboard2.png b/docs/_images/dashboard2.png new file mode 100644 index 0000000..27f0be0 Binary files /dev/null and b/docs/_images/dashboard2.png differ diff --git a/docs/_images/dashboard_installed.png b/docs/_images/dashboard_installed.png new file mode 100644 index 0000000..eb2cba2 Binary files /dev/null and b/docs/_images/dashboard_installed.png differ diff --git a/docs/_images/dashboard_view.png b/docs/_images/dashboard_view.png new file mode 100644 index 0000000..47c8116 Binary files /dev/null and b/docs/_images/dashboard_view.png differ diff --git a/docs/_images/dashboardover1-v2.png b/docs/_images/dashboardover1-v2.png new file mode 100644 index 0000000..f0e17a1 Binary files /dev/null and b/docs/_images/dashboardover1-v2.png differ diff --git a/docs/_images/dashboardover2-v2.png b/docs/_images/dashboardover2-v2.png new file mode 100644 index 0000000..1a7802e Binary files /dev/null and b/docs/_images/dashboardover2-v2.png differ diff --git a/docs/_images/dask_dashboard_5_workers.png b/docs/_images/dask_dashboard_5_workers.png new file mode 100644 index 0000000..d36be08 Binary files /dev/null and b/docs/_images/dask_dashboard_5_workers.png differ diff --git a/docs/_images/debian_test_created.png b/docs/_images/debian_test_created.png new file mode 100644 index 0000000..8f3ddfb Binary files /dev/null and b/docs/_images/debian_test_created.png differ diff --git a/docs/_images/default_security_groups.png b/docs/_images/default_security_groups.png new file mode 100644 index 0000000..567dd02 Binary files /dev/null and b/docs/_images/default_security_groups.png differ diff --git a/docs/_images/devvdb.png b/docs/_images/devvdb.png new file mode 100644 index 0000000..95762b5 Binary files /dev/null and b/docs/_images/devvdb.png differ diff --git a/docs/_images/dns1.png b/docs/_images/dns1.png new file mode 100644 index 0000000..9ac83d9 Binary files /dev/null and b/docs/_images/dns1.png differ diff --git a/docs/_images/dockerspace_created.png b/docs/_images/dockerspace_created.png new file mode 100644 index 0000000..1368dfc Binary files /dev/null and b/docs/_images/dockerspace_created.png differ diff --git a/docs/_images/download_config_cli.png b/docs/_images/download_config_cli.png new file mode 100644 index 0000000..91c4daf Binary files /dev/null and b/docs/_images/download_config_cli.png differ diff --git a/docs/_images/download_config_horizon.png b/docs/_images/download_config_horizon.png new file mode 100644 index 0000000..cdf493a Binary files /dev/null and b/docs/_images/download_config_horizon.png differ diff --git a/docs/_images/download_rc_file_2fa.png b/docs/_images/download_rc_file_2fa.png new file mode 100644 index 0000000..3e8aac0 Binary files /dev/null and b/docs/_images/download_rc_file_2fa.png differ diff --git a/docs/_images/drop-down-menu.png b/docs/_images/drop-down-menu.png new file mode 100644 index 0000000..b17c1b1 Binary files /dev/null and b/docs/_images/drop-down-menu.png differ diff --git a/docs/_images/edit.png b/docs/_images/edit.png new file mode 100644 index 0000000..62ee55a Binary files /dev/null and b/docs/_images/edit.png differ diff --git a/docs/_images/editing_profile_cloudferrocloud.png b/docs/_images/editing_profile_cloudferrocloud.png new file mode 100644 index 0000000..8c4687a Binary files /dev/null and b/docs/_images/editing_profile_cloudferrocloud.png differ diff --git a/docs/_images/eefa_freeotp_qr_icon.png b/docs/_images/eefa_freeotp_qr_icon.png new file mode 100644 index 0000000..1fc102d Binary files /dev/null and b/docs/_images/eefa_freeotp_qr_icon.png differ diff --git a/docs/_images/eefa_logged_in_creodias.png b/docs/_images/eefa_logged_in_creodias.png new file mode 100644 index 0000000..3cb4055 Binary files /dev/null and b/docs/_images/eefa_logged_in_creodias.png differ diff --git a/docs/_images/eefa_logged_in_creodias.png.md b/docs/_images/eefa_logged_in_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_logged_in_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_mobile_auth_setup_creodias.png b/docs/_images/eefa_mobile_auth_setup_creodias.png new file mode 100644 index 0000000..4ea0248 Binary files /dev/null and b/docs/_images/eefa_mobile_auth_setup_creodias.png differ diff --git a/docs/_images/eefa_mobile_auth_setup_creodias.png.md b/docs/_images/eefa_mobile_auth_setup_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_mobile_auth_setup_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_qr_screen_creodias.png b/docs/_images/eefa_qr_screen_creodias.png new file mode 100644 index 0000000..2d5eac1 Binary files /dev/null and b/docs/_images/eefa_qr_screen_creodias.png differ diff --git a/docs/_images/eefa_qr_screen_creodias.png.md b/docs/_images/eefa_qr_screen_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_qr_screen_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_restart_login_creodias.png b/docs/_images/eefa_restart_login_creodias.png new file mode 100644 index 0000000..5ba7dae Binary files /dev/null and b/docs/_images/eefa_restart_login_creodias.png differ diff --git a/docs/_images/eefa_restart_login_creodias.png.md b/docs/_images/eefa_restart_login_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_restart_login_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_several_rows.png b/docs/_images/eefa_several_rows.png new file mode 100644 index 0000000..57b889f Binary files /dev/null and b/docs/_images/eefa_several_rows.png differ diff --git a/docs/_images/eefa_several_rows.png.md b/docs/_images/eefa_several_rows.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_several_rows.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_sign_regular_creodias.png b/docs/_images/eefa_sign_regular_creodias.png new file mode 100644 index 0000000..8328b00 Binary files /dev/null and b/docs/_images/eefa_sign_regular_creodias.png differ diff --git a/docs/_images/eefa_sign_regular_creodias.png.md b/docs/_images/eefa_sign_regular_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_sign_regular_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_start_creodias.png b/docs/_images/eefa_start_creodias.png new file mode 100644 index 0000000..2a09a9e Binary files /dev/null and b/docs/_images/eefa_start_creodias.png differ diff --git a/docs/_images/eefa_start_creodias.png.md b/docs/_images/eefa_start_creodias.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_start_creodias.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/eefa_tapped.png b/docs/_images/eefa_tapped.png new file mode 100644 index 0000000..d61c760 Binary files /dev/null and b/docs/_images/eefa_tapped.png differ diff --git a/docs/_images/eefa_tapped.png.md b/docs/_images/eefa_tapped.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/eefa_tapped.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/enable_load_balancer_checked.png b/docs/_images/enable_load_balancer_checked.png new file mode 100644 index 0000000..119ac36 Binary files /dev/null and b/docs/_images/enable_load_balancer_checked.png differ diff --git a/docs/_images/enable_load_balancer_unchecked.png b/docs/_images/enable_load_balancer_unchecked.png new file mode 100644 index 0000000..852884e Binary files /dev/null and b/docs/_images/enable_load_balancer_unchecked.png differ diff --git a/docs/_images/enabled.png b/docs/_images/enabled.png new file mode 100644 index 0000000..7c441c4 Binary files /dev/null and b/docs/_images/enabled.png differ diff --git a/docs/_images/enter_new_password_cloudferrocloud.png b/docs/_images/enter_new_password_cloudferrocloud.png new file mode 100644 index 0000000..8af7335 Binary files /dev/null and b/docs/_images/enter_new_password_cloudferrocloud.png differ diff --git a/docs/_images/enter_the_six_digit_code2.png b/docs/_images/enter_the_six_digit_code2.png new file mode 100644 index 0000000..bbeecca Binary files /dev/null and b/docs/_images/enter_the_six_digit_code2.png differ diff --git a/docs/_images/export_os_cloud.png b/docs/_images/export_os_cloud.png new file mode 100644 index 0000000..89f9f5d Binary files /dev/null and b/docs/_images/export_os_cloud.png differ diff --git a/docs/_images/fedora_image.png b/docs/_images/fedora_image.png new file mode 100644 index 0000000..5f642fe Binary files /dev/null and b/docs/_images/fedora_image.png differ diff --git a/docs/_images/filtered_cirros.png b/docs/_images/filtered_cirros.png new file mode 100644 index 0000000..f89ee3c Binary files /dev/null and b/docs/_images/filtered_cirros.png differ diff --git a/docs/_images/final_result.png b/docs/_images/final_result.png new file mode 100644 index 0000000..b988e67 Binary files /dev/null and b/docs/_images/final_result.png differ diff --git a/docs/_images/fip1.png b/docs/_images/fip1.png new file mode 100644 index 0000000..5aec841 Binary files /dev/null and b/docs/_images/fip1.png differ diff --git a/docs/_images/fip2.png b/docs/_images/fip2.png new file mode 100644 index 0000000..019dd84 Binary files /dev/null and b/docs/_images/fip2.png differ diff --git a/docs/_images/fip3.png b/docs/_images/fip3.png new file mode 100644 index 0000000..5add93c Binary files /dev/null and b/docs/_images/fip3.png differ diff --git a/docs/_images/fip4.png b/docs/_images/fip4.png new file mode 100644 index 0000000..5fa2556 Binary files /dev/null and b/docs/_images/fip4.png differ diff --git a/docs/_images/fip5.png b/docs/_images/fip5.png new file mode 100644 index 0000000..5ad58b5 Binary files /dev/null and b/docs/_images/fip5.png differ diff --git a/docs/_images/fip6.png b/docs/_images/fip6.png new file mode 100644 index 0000000..7cf1a46 Binary files /dev/null and b/docs/_images/fip6.png differ diff --git a/docs/_images/fip7.png b/docs/_images/fip7.png new file mode 100644 index 0000000..2f6c9b7 Binary files /dev/null and b/docs/_images/fip7.png differ diff --git a/docs/_images/fip8.png b/docs/_images/fip8.png new file mode 100644 index 0000000..1565416 Binary files /dev/null and b/docs/_images/fip8.png differ diff --git a/docs/_images/fip9.png b/docs/_images/fip9.png new file mode 100644 index 0000000..33b748c Binary files /dev/null and b/docs/_images/fip9.png differ diff --git a/docs/_images/first_argo_example.png b/docs/_images/first_argo_example.png new file mode 100644 index 0000000..bdfb03b Binary files /dev/null and b/docs/_images/first_argo_example.png differ diff --git a/docs/_images/fixconsole.png b/docs/_images/fixconsole.png new file mode 100644 index 0000000..c92a69c Binary files /dev/null and b/docs/_images/fixconsole.png differ diff --git a/docs/_images/flask_run.png b/docs/_images/flask_run.png new file mode 100644 index 0000000..9ab38cb Binary files /dev/null and b/docs/_images/flask_run.png differ diff --git a/docs/_images/flavor2_master2.png b/docs/_images/flavor2_master2.png new file mode 100644 index 0000000..61b184f Binary files /dev/null and b/docs/_images/flavor2_master2.png differ diff --git a/docs/_images/flavor_list_2fa_short.png b/docs/_images/flavor_list_2fa_short.png new file mode 100644 index 0000000..4647f58 Binary files /dev/null and b/docs/_images/flavor_list_2fa_short.png differ diff --git a/docs/_images/flavors_list.png b/docs/_images/flavors_list.png new file mode 100644 index 0000000..8160b54 Binary files /dev/null and b/docs/_images/flavors_list.png differ diff --git a/docs/_images/flavors_listed_spot.png b/docs/_images/flavors_listed_spot.png new file mode 100644 index 0000000..999d9e6 Binary files /dev/null and b/docs/_images/flavors_listed_spot.png differ diff --git a/docs/_images/floating_ip_created.png b/docs/_images/floating_ip_created.png new file mode 100644 index 0000000..5248c6a Binary files /dev/null and b/docs/_images/floating_ip_created.png differ diff --git a/docs/_images/floating_ips.png b/docs/_images/floating_ips.png new file mode 100644 index 0000000..99cc728 Binary files /dev/null and b/docs/_images/floating_ips.png differ diff --git a/docs/_images/forgot_your_password_cloudferrocloud.png b/docs/_images/forgot_your_password_cloudferrocloud.png new file mode 100644 index 0000000..36c8e05 Binary files /dev/null and b/docs/_images/forgot_your_password_cloudferrocloud.png differ diff --git a/docs/_images/format_image_upload.png b/docs/_images/format_image_upload.png new file mode 100644 index 0000000..3101570 Binary files /dev/null and b/docs/_images/format_image_upload.png differ diff --git a/docs/_images/four_created.png b/docs/_images/four_created.png new file mode 100644 index 0000000..2e64431 Binary files /dev/null and b/docs/_images/four_created.png differ diff --git a/docs/_images/fra1-2-default-template.png b/docs/_images/fra1-2-default-template.png new file mode 100644 index 0000000..3499deb Binary files /dev/null and b/docs/_images/fra1-2-default-template.png differ diff --git a/docs/_images/freeotp_icon_to_select.png b/docs/_images/freeotp_icon_to_select.png new file mode 100644 index 0000000..d35ebd5 Binary files /dev/null and b/docs/_images/freeotp_icon_to_select.png differ diff --git a/docs/_images/freeotp_icon_to_select.png.md b/docs/_images/freeotp_icon_to_select.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/freeotp_icon_to_select.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/freeotp_tapped_number.png b/docs/_images/freeotp_tapped_number.png new file mode 100644 index 0000000..f9ac40a Binary files /dev/null and b/docs/_images/freeotp_tapped_number.png differ diff --git a/docs/_images/freeotp_tapped_number.png.md b/docs/_images/freeotp_tapped_number.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/freeotp_tapped_number.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/fwaas-openvpn-v2-34.png b/docs/_images/fwaas-openvpn-v2-34.png new file mode 100644 index 0000000..3b8f6f1 Binary files /dev/null and b/docs/_images/fwaas-openvpn-v2-34.png differ diff --git a/docs/_images/generate_credentials.png b/docs/_images/generate_credentials.png new file mode 100644 index 0000000..5609d2e Binary files /dev/null and b/docs/_images/generate_credentials.png differ diff --git a/docs/_images/get_nodes_large.png b/docs/_images/get_nodes_large.png new file mode 100644 index 0000000..52cd50c Binary files /dev/null and b/docs/_images/get_nodes_large.png differ diff --git a/docs/_images/git-bash01_creodias.png b/docs/_images/git-bash01_creodias.png new file mode 100644 index 0000000..5aa638b Binary files /dev/null and b/docs/_images/git-bash01_creodias.png differ diff --git a/docs/_images/git-bash02_creodias.png b/docs/_images/git-bash02_creodias.png new file mode 100644 index 0000000..d9a2a5d Binary files /dev/null and b/docs/_images/git-bash02_creodias.png differ diff --git a/docs/_images/git-bash03_creodias.png b/docs/_images/git-bash03_creodias.png new file mode 100644 index 0000000..8743d9e Binary files /dev/null and b/docs/_images/git-bash03_creodias.png differ diff --git a/docs/_images/git-bash04_creodias.png b/docs/_images/git-bash04_creodias.png new file mode 100644 index 0000000..981aa01 Binary files /dev/null and b/docs/_images/git-bash04_creodias.png differ diff --git a/docs/_images/git-bash05_creodias.png b/docs/_images/git-bash05_creodias.png new file mode 100644 index 0000000..4aaa040 Binary files /dev/null and b/docs/_images/git-bash05_creodias.png differ diff --git a/docs/_images/git-bash06_creodias.png b/docs/_images/git-bash06_creodias.png new file mode 100644 index 0000000..9db0c23 Binary files /dev/null and b/docs/_images/git-bash06_creodias.png differ diff --git a/docs/_images/git-bash07_creodias.png b/docs/_images/git-bash07_creodias.png new file mode 100644 index 0000000..6211334 Binary files /dev/null and b/docs/_images/git-bash07_creodias.png differ diff --git a/docs/_images/git-bash09_creodias.png b/docs/_images/git-bash09_creodias.png new file mode 100644 index 0000000..0657e0b Binary files /dev/null and b/docs/_images/git-bash09_creodias.png differ diff --git a/docs/_images/git-bash10_creodias.png b/docs/_images/git-bash10_creodias.png new file mode 100644 index 0000000..ba39ce7 Binary files /dev/null and b/docs/_images/git-bash10_creodias.png differ diff --git a/docs/_images/git-bash11_creodias.png b/docs/_images/git-bash11_creodias.png new file mode 100644 index 0000000..81eb1b6 Binary files /dev/null and b/docs/_images/git-bash11_creodias.png differ diff --git a/docs/_images/git-bash12_creodias.png b/docs/_images/git-bash12_creodias.png new file mode 100644 index 0000000..cc2b691 Binary files /dev/null and b/docs/_images/git-bash12_creodias.png differ diff --git a/docs/_images/git-bash17_creodias.png b/docs/_images/git-bash17_creodias.png new file mode 100644 index 0000000..061695d Binary files /dev/null and b/docs/_images/git-bash17_creodias.png differ diff --git a/docs/_images/gitlab_get_pods.png b/docs/_images/gitlab_get_pods.png new file mode 100644 index 0000000..b253451 Binary files /dev/null and b/docs/_images/gitlab_get_pods.png differ diff --git a/docs/_images/go_template_image.png b/docs/_images/go_template_image.png new file mode 100644 index 0000000..e111194 Binary files /dev/null and b/docs/_images/go_template_image.png differ diff --git a/docs/_images/gpu_templates.png b/docs/_images/gpu_templates.png new file mode 100644 index 0000000..e0f74a4 Binary files /dev/null and b/docs/_images/gpu_templates.png differ diff --git a/docs/_images/heat-test2.png b/docs/_images/heat-test2.png new file mode 100644 index 0000000..6cb249f Binary files /dev/null and b/docs/_images/heat-test2.png differ diff --git a/docs/_images/heat_instance.png b/docs/_images/heat_instance.png new file mode 100644 index 0000000..34b90dd Binary files /dev/null and b/docs/_images/heat_instance.png differ diff --git a/docs/_images/heat_test2_instances.png b/docs/_images/heat_test2_instances.png new file mode 100644 index 0000000..dfd216c Binary files /dev/null and b/docs/_images/heat_test2_instances.png differ diff --git a/docs/_images/heat_test2_stacks.png b/docs/_images/heat_test2_stacks.png new file mode 100644 index 0000000..93a3c87 Binary files /dev/null and b/docs/_images/heat_test2_stacks.png differ diff --git a/docs/_images/horizon_flavors.png b/docs/_images/horizon_flavors.png new file mode 100644 index 0000000..4e4115a Binary files /dev/null and b/docs/_images/horizon_flavors.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-12_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-12_creodias.png new file mode 100644 index 0000000..5b049d0 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-12_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-13_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-13_creodias.png new file mode 100644 index 0000000..a7a0a24 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-13_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-14_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-14_creodias.png new file mode 100644 index 0000000..cd4e7eb Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-14_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-15_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-15_creodias.png new file mode 100644 index 0000000..de7eac4 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-15_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-16_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-16_creodias.png new file mode 100644 index 0000000..954fecc Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-16_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-17_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-17_creodias.png new file mode 100644 index 0000000..3ec6ac4 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-17_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-18_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-18_creodias.png new file mode 100644 index 0000000..edc59ce Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-18_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-19_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-19_creodias.png new file mode 100644 index 0000000..aa44ade Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-19_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-20_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-20_creodias.png new file mode 100644 index 0000000..0279381 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-20_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-21_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-21_creodias.png new file mode 100644 index 0000000..f92dc94 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-21_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-22_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-22_creodias.png new file mode 100644 index 0000000..5789719 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-22_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-cli-23_creodias.png b/docs/_images/how-to-create-instance-snapshot-cli-23_creodias.png new file mode 100644 index 0000000..1c67a2d Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-cli-23_creodias.png differ diff --git a/docs/_images/how-to-create-instance-snapshot-horizon-13_creodias.png b/docs/_images/how-to-create-instance-snapshot-horizon-13_creodias.png new file mode 100644 index 0000000..d661803 Binary files /dev/null and b/docs/_images/how-to-create-instance-snapshot-horizon-13_creodias.png differ diff --git a/docs/_images/how-to-create-rotating-backups-05_creodias.png b/docs/_images/how-to-create-rotating-backups-05_creodias.png new file mode 100644 index 0000000..e56575b Binary files /dev/null and b/docs/_images/how-to-create-rotating-backups-05_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-01_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-01_creodias.png new file mode 100644 index 0000000..9afb6ae Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-01_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-02_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-02_creodias.png new file mode 100644 index 0000000..9985d01 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-02_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-03_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-03_creodias.png new file mode 100644 index 0000000..1c25fd4 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-03_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-04_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-04_creodias.png new file mode 100644 index 0000000..0452673 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-04_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-05_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-05_creodias.png new file mode 100644 index 0000000..2055728 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-05_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-06_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-06_creodias.png new file mode 100644 index 0000000..9b15293 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-06_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-07_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-07_creodias.png new file mode 100644 index 0000000..b7990aa Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-07_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-Horizon-08_creodias.png b/docs/_images/how-to-create-volume-snapshot-Horizon-08_creodias.png new file mode 100644 index 0000000..56648d4 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-Horizon-08_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-cli-01_creodias.png b/docs/_images/how-to-create-volume-snapshot-cli-01_creodias.png new file mode 100644 index 0000000..1afd3f7 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-cli-01_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-cli-02_creodias.png b/docs/_images/how-to-create-volume-snapshot-cli-02_creodias.png new file mode 100644 index 0000000..8450b4f Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-cli-02_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-cli-03_creodias.png b/docs/_images/how-to-create-volume-snapshot-cli-03_creodias.png new file mode 100644 index 0000000..5915525 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-cli-03_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-cli-04_creodias.png b/docs/_images/how-to-create-volume-snapshot-cli-04_creodias.png new file mode 100644 index 0000000..ed4b657 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-cli-04_creodias.png differ diff --git a/docs/_images/how-to-create-volume-snapshot-cli-05_creodias.png b/docs/_images/how-to-create-volume-snapshot-cli-05_creodias.png new file mode 100644 index 0000000..0dc2154 Binary files /dev/null and b/docs/_images/how-to-create-volume-snapshot-cli-05_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-12_creodias.png b/docs/_images/how-to-move-data-volume-cli-12_creodias.png new file mode 100644 index 0000000..d93be5f Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-12_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-13_creodias.png b/docs/_images/how-to-move-data-volume-cli-13_creodias.png new file mode 100644 index 0000000..5b17af9 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-13_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-14_creodias.png b/docs/_images/how-to-move-data-volume-cli-14_creodias.png new file mode 100644 index 0000000..3631f1b Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-14_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-15_creodias.png b/docs/_images/how-to-move-data-volume-cli-15_creodias.png new file mode 100644 index 0000000..ee9c4f8 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-15_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-31_creodias.png b/docs/_images/how-to-move-data-volume-cli-31_creodias.png new file mode 100644 index 0000000..295e11c Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-31_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-cli-32_creodias.png b/docs/_images/how-to-move-data-volume-cli-32_creodias.png new file mode 100644 index 0000000..ab27b35 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-cli-32_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-05_creodias.png b/docs/_images/how-to-move-data-volume-horizon-05_creodias.png new file mode 100644 index 0000000..4d772a2 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-05_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-06_creodias.png b/docs/_images/how-to-move-data-volume-horizon-06_creodias.png new file mode 100644 index 0000000..c059523 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-06_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-07_creodias.png b/docs/_images/how-to-move-data-volume-horizon-07_creodias.png new file mode 100644 index 0000000..a2294ae Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-07_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-08_creodias.png b/docs/_images/how-to-move-data-volume-horizon-08_creodias.png new file mode 100644 index 0000000..10afe81 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-08_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-09_creodias.png b/docs/_images/how-to-move-data-volume-horizon-09_creodias.png new file mode 100644 index 0000000..f341f07 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-09_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-10_creodias.png b/docs/_images/how-to-move-data-volume-horizon-10_creodias.png new file mode 100644 index 0000000..3c84141 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-10_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-27_creodias.png b/docs/_images/how-to-move-data-volume-horizon-27_creodias.png new file mode 100644 index 0000000..c1d8c32 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-27_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-28_creodias.png b/docs/_images/how-to-move-data-volume-horizon-28_creodias.png new file mode 100644 index 0000000..a275f4b Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-28_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-29_creodias.png b/docs/_images/how-to-move-data-volume-horizon-29_creodias.png new file mode 100644 index 0000000..f0b6371 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-29_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-30_creodias.png b/docs/_images/how-to-move-data-volume-horizon-30_creodias.png new file mode 100644 index 0000000..cc9237a Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-30_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-33_creodias.png b/docs/_images/how-to-move-data-volume-horizon-33_creodias.png new file mode 100644 index 0000000..422677f Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-33_creodias.png differ diff --git a/docs/_images/how-to-move-data-volume-horizon-34_creodias.png b/docs/_images/how-to-move-data-volume-horizon-34_creodias.png new file mode 100644 index 0000000..668a0d5 Binary files /dev/null and b/docs/_images/how-to-move-data-volume-horizon-34_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-Horizon-01_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-01_creodias.png new file mode 100644 index 0000000..d7d8c62 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-01_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-Horizon-02_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-02_creodias.png new file mode 100644 index 0000000..e39be29 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-02_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-Horizon-03_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-03_creodias.png new file mode 100644 index 0000000..9c5a7e1 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-03_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-Horizon-04_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-04_creodias.png new file mode 100644 index 0000000..22cead1 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-Horizon-04_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-cli-01_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-cli-01_creodias.png new file mode 100644 index 0000000..1320997 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-cli-01_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-cli-02_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-cli-02_creodias.png new file mode 100644 index 0000000..0a79a90 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-cli-02_creodias.png differ diff --git a/docs/_images/how-to-restore-volume-from-snapshot-cli-03_creodias.png b/docs/_images/how-to-restore-volume-from-snapshot-cli-03_creodias.png new file mode 100644 index 0000000..e3029b1 Binary files /dev/null and b/docs/_images/how-to-restore-volume-from-snapshot-cli-03_creodias.png differ diff --git a/docs/_images/identity_projects.png b/docs/_images/identity_projects.png new file mode 100644 index 0000000..6cbd497 Binary files /dev/null and b/docs/_images/identity_projects.png differ diff --git a/docs/_images/image-2024-2-13_13-15-17.png b/docs/_images/image-2024-2-13_13-15-17.png new file mode 100644 index 0000000..a3baee2 Binary files /dev/null and b/docs/_images/image-2024-2-13_13-15-17.png differ diff --git a/docs/_images/image-2024-2-13_14-44-49.png b/docs/_images/image-2024-2-13_14-44-49.png new file mode 100644 index 0000000..9dcaa11 Binary files /dev/null and b/docs/_images/image-2024-2-13_14-44-49.png differ diff --git a/docs/_images/image-2024-2-13_15-39-52.png b/docs/_images/image-2024-2-13_15-39-52.png new file mode 100644 index 0000000..6018b78 Binary files /dev/null and b/docs/_images/image-2024-2-13_15-39-52.png differ diff --git a/docs/_images/image-2024-2-13_15-48-38.png b/docs/_images/image-2024-2-13_15-48-38.png new file mode 100644 index 0000000..ced9ccd Binary files /dev/null and b/docs/_images/image-2024-2-13_15-48-38.png differ diff --git a/docs/_images/image-2024-2-13_15-58-45.png b/docs/_images/image-2024-2-13_15-58-45.png new file mode 100644 index 0000000..7d73096 Binary files /dev/null and b/docs/_images/image-2024-2-13_15-58-45.png differ diff --git a/docs/_images/image-2024-2-13_16-13-21.png b/docs/_images/image-2024-2-13_16-13-21.png new file mode 100644 index 0000000..c5859e7 Binary files /dev/null and b/docs/_images/image-2024-2-13_16-13-21.png differ diff --git a/docs/_images/image-2024-2-13_16-29-35.png b/docs/_images/image-2024-2-13_16-29-35.png new file mode 100644 index 0000000..f0fc7c0 Binary files /dev/null and b/docs/_images/image-2024-2-13_16-29-35.png differ diff --git a/docs/_images/image-2024-2-13_16-31-37.png b/docs/_images/image-2024-2-13_16-31-37.png new file mode 100644 index 0000000..474ed07 Binary files /dev/null and b/docs/_images/image-2024-2-13_16-31-37.png differ diff --git a/docs/_images/image-2024-2-13_16-8-43.png b/docs/_images/image-2024-2-13_16-8-43.png new file mode 100644 index 0000000..309e507 Binary files /dev/null and b/docs/_images/image-2024-2-13_16-8-43.png differ diff --git a/docs/_images/image-2024-4-26_15-4-3.png b/docs/_images/image-2024-4-26_15-4-3.png new file mode 100644 index 0000000..fd41ecc Binary files /dev/null and b/docs/_images/image-2024-4-26_15-4-3.png differ diff --git a/docs/_images/image-2024-4-26_16-58-33.png b/docs/_images/image-2024-4-26_16-58-33.png new file mode 100644 index 0000000..c831584 Binary files /dev/null and b/docs/_images/image-2024-4-26_16-58-33.png differ diff --git a/docs/_images/image-2024-4-26_17-57-57.png b/docs/_images/image-2024-4-26_17-57-57.png new file mode 100644 index 0000000..9ddb230 Binary files /dev/null and b/docs/_images/image-2024-4-26_17-57-57.png differ diff --git a/docs/_images/image-2024-4-29_12-56-40.png b/docs/_images/image-2024-4-29_12-56-40.png new file mode 100644 index 0000000..2eaa9fa Binary files /dev/null and b/docs/_images/image-2024-4-29_12-56-40.png differ diff --git a/docs/_images/image-2024-4-29_14-13-1.png b/docs/_images/image-2024-4-29_14-13-1.png new file mode 100644 index 0000000..3e62d3e Binary files /dev/null and b/docs/_images/image-2024-4-29_14-13-1.png differ diff --git a/docs/_images/image-2024-4-29_14-16-12.png b/docs/_images/image-2024-4-29_14-16-12.png new file mode 100644 index 0000000..a75c89b Binary files /dev/null and b/docs/_images/image-2024-4-29_14-16-12.png differ diff --git a/docs/_images/image-2024-4-30_14-0-23.png b/docs/_images/image-2024-4-30_14-0-23.png new file mode 100644 index 0000000..0202715 Binary files /dev/null and b/docs/_images/image-2024-4-30_14-0-23.png differ diff --git a/docs/_images/image-2024-5-10_16-28-4.png b/docs/_images/image-2024-5-10_16-28-4.png new file mode 100644 index 0000000..22aac8f Binary files /dev/null and b/docs/_images/image-2024-5-10_16-28-4.png differ diff --git a/docs/_images/image-2024-5-10_16-30-8.png b/docs/_images/image-2024-5-10_16-30-8.png new file mode 100644 index 0000000..1c88f71 Binary files /dev/null and b/docs/_images/image-2024-5-10_16-30-8.png differ diff --git a/docs/_images/image-2024-5-14_14-54-10.png b/docs/_images/image-2024-5-14_14-54-10.png new file mode 100644 index 0000000..aef9dfb Binary files /dev/null and b/docs/_images/image-2024-5-14_14-54-10.png differ diff --git a/docs/_images/image-2024-5-14_15-34-0.png b/docs/_images/image-2024-5-14_15-34-0.png new file mode 100644 index 0000000..46e2ab0 Binary files /dev/null and b/docs/_images/image-2024-5-14_15-34-0.png differ diff --git a/docs/_images/image-2024-5-14_15-4-21.png b/docs/_images/image-2024-5-14_15-4-21.png new file mode 100644 index 0000000..756a6c6 Binary files /dev/null and b/docs/_images/image-2024-5-14_15-4-21.png differ diff --git a/docs/_images/image-2024-5-17_11-20-27.png b/docs/_images/image-2024-5-17_11-20-27.png new file mode 100644 index 0000000..55a6e28 Binary files /dev/null and b/docs/_images/image-2024-5-17_11-20-27.png differ diff --git a/docs/_images/image-2024-5-22_10-23-58.png b/docs/_images/image-2024-5-22_10-23-58.png new file mode 100644 index 0000000..f4a9fd6 Binary files /dev/null and b/docs/_images/image-2024-5-22_10-23-58.png differ diff --git a/docs/_images/image-2024-5-22_10-27-25.png b/docs/_images/image-2024-5-22_10-27-25.png new file mode 100644 index 0000000..7c3c337 Binary files /dev/null and b/docs/_images/image-2024-5-22_10-27-25.png differ diff --git a/docs/_images/image-2024-5-22_10-38-53.png b/docs/_images/image-2024-5-22_10-38-53.png new file mode 100644 index 0000000..73080e5 Binary files /dev/null and b/docs/_images/image-2024-5-22_10-38-53.png differ diff --git a/docs/_images/image-2024-5-22_11-17-12.png b/docs/_images/image-2024-5-22_11-17-12.png new file mode 100644 index 0000000..0dacc1c Binary files /dev/null and b/docs/_images/image-2024-5-22_11-17-12.png differ diff --git a/docs/_images/image-2024-5-23_17-16-2.png b/docs/_images/image-2024-5-23_17-16-2.png new file mode 100644 index 0000000..64ccf40 Binary files /dev/null and b/docs/_images/image-2024-5-23_17-16-2.png differ diff --git a/docs/_images/image-2024-5-23_17-39-37.png b/docs/_images/image-2024-5-23_17-39-37.png new file mode 100644 index 0000000..9a4d957 Binary files /dev/null and b/docs/_images/image-2024-5-23_17-39-37.png differ diff --git a/docs/_images/image-2024-5-6_13-48-13.png b/docs/_images/image-2024-5-6_13-48-13.png new file mode 100644 index 0000000..225ff54 Binary files /dev/null and b/docs/_images/image-2024-5-6_13-48-13.png differ diff --git a/docs/_images/image-2024-5-6_14-25-36.png b/docs/_images/image-2024-5-6_14-25-36.png new file mode 100644 index 0000000..a09a3e2 Binary files /dev/null and b/docs/_images/image-2024-5-6_14-25-36.png differ diff --git a/docs/_images/image-2024-6-17_15-52-40.png b/docs/_images/image-2024-6-17_15-52-40.png new file mode 100644 index 0000000..705e484 Binary files /dev/null and b/docs/_images/image-2024-6-17_15-52-40.png differ diff --git a/docs/_images/image-2024-6-18_17-32-8.png b/docs/_images/image-2024-6-18_17-32-8.png new file mode 100644 index 0000000..df6a1a1 Binary files /dev/null and b/docs/_images/image-2024-6-18_17-32-8.png differ diff --git a/docs/_images/image-2024-6-18_18-1-53.png b/docs/_images/image-2024-6-18_18-1-53.png new file mode 100644 index 0000000..8ff89c0 Binary files /dev/null and b/docs/_images/image-2024-6-18_18-1-53.png differ diff --git a/docs/_images/image-2024-7-23_16-5-28.png b/docs/_images/image-2024-7-23_16-5-28.png new file mode 100644 index 0000000..fd7400a Binary files /dev/null and b/docs/_images/image-2024-7-23_16-5-28.png differ diff --git a/docs/_images/image-2024-7-24_13-56-3.png b/docs/_images/image-2024-7-24_13-56-3.png new file mode 100644 index 0000000..3daa33f Binary files /dev/null and b/docs/_images/image-2024-7-24_13-56-3.png differ diff --git a/docs/_images/image-2024-7-24_14-9-18.png b/docs/_images/image-2024-7-24_14-9-18.png new file mode 100644 index 0000000..5221fdb Binary files /dev/null and b/docs/_images/image-2024-7-24_14-9-18.png differ diff --git a/docs/_images/image-2024-7-24_15-20-4.png b/docs/_images/image-2024-7-24_15-20-4.png new file mode 100644 index 0000000..aa76077 Binary files /dev/null and b/docs/_images/image-2024-7-24_15-20-4.png differ diff --git a/docs/_images/image-2024-7-24_15-27-55.png b/docs/_images/image-2024-7-24_15-27-55.png new file mode 100644 index 0000000..fd7400a Binary files /dev/null and b/docs/_images/image-2024-7-24_15-27-55.png differ diff --git a/docs/_images/image-2024-7-24_15-29-17.png b/docs/_images/image-2024-7-24_15-29-17.png new file mode 100644 index 0000000..7a5b400 Binary files /dev/null and b/docs/_images/image-2024-7-24_15-29-17.png differ diff --git a/docs/_images/image-2024-7-24_15-30-26.png b/docs/_images/image-2024-7-24_15-30-26.png new file mode 100644 index 0000000..cd83def Binary files /dev/null and b/docs/_images/image-2024-7-24_15-30-26.png differ diff --git a/docs/_images/image-2024-7-26_12-36-54.png b/docs/_images/image-2024-7-26_12-36-54.png new file mode 100644 index 0000000..d52d8bc Binary files /dev/null and b/docs/_images/image-2024-7-26_12-36-54.png differ diff --git a/docs/_images/image-2024-7-29_10-2-57.png b/docs/_images/image-2024-7-29_10-2-57.png new file mode 100644 index 0000000..31174ee Binary files /dev/null and b/docs/_images/image-2024-7-29_10-2-57.png differ diff --git a/docs/_images/image-2024-7-29_9-54-45.png b/docs/_images/image-2024-7-29_9-54-45.png new file mode 100644 index 0000000..9614832 Binary files /dev/null and b/docs/_images/image-2024-7-29_9-54-45.png differ diff --git a/docs/_images/image-2024-7-29_9-56-44.png b/docs/_images/image-2024-7-29_9-56-44.png new file mode 100644 index 0000000..ba4f106 Binary files /dev/null and b/docs/_images/image-2024-7-29_9-56-44.png differ diff --git a/docs/_images/image-end-of-article.png b/docs/_images/image-end-of-article.png new file mode 100644 index 0000000..c7bbfd3 Binary files /dev/null and b/docs/_images/image-end-of-article.png differ diff --git a/docs/_images/image2022-12-9_10-55-8.png b/docs/_images/image2022-12-9_10-55-8.png new file mode 100644 index 0000000..0e4e966 Binary files /dev/null and b/docs/_images/image2022-12-9_10-55-8.png differ diff --git a/docs/_images/image2023-1-13_13-6-5.png b/docs/_images/image2023-1-13_13-6-5.png new file mode 100644 index 0000000..edc921f Binary files /dev/null and b/docs/_images/image2023-1-13_13-6-5.png differ diff --git a/docs/_images/image2023-11-7_13-17-10.png b/docs/_images/image2023-11-7_13-17-10.png new file mode 100644 index 0000000..faa5da7 Binary files /dev/null and b/docs/_images/image2023-11-7_13-17-10.png differ diff --git a/docs/_images/image2023-11-7_13-22-56.png b/docs/_images/image2023-11-7_13-22-56.png new file mode 100644 index 0000000..6c10e94 Binary files /dev/null and b/docs/_images/image2023-11-7_13-22-56.png differ diff --git a/docs/_images/image2023-11-7_13-40-1.png b/docs/_images/image2023-11-7_13-40-1.png new file mode 100644 index 0000000..7a42f78 Binary files /dev/null and b/docs/_images/image2023-11-7_13-40-1.png differ diff --git a/docs/_images/image2023-11-7_14-24-1.png b/docs/_images/image2023-11-7_14-24-1.png new file mode 100644 index 0000000..42a78e7 Binary files /dev/null and b/docs/_images/image2023-11-7_14-24-1.png differ diff --git a/docs/_images/image2023-11-7_14-47-56.png b/docs/_images/image2023-11-7_14-47-56.png new file mode 100644 index 0000000..f027550 Binary files /dev/null and b/docs/_images/image2023-11-7_14-47-56.png differ diff --git a/docs/_images/image2023-11-7_14-54-8.png b/docs/_images/image2023-11-7_14-54-8.png new file mode 100644 index 0000000..5d0c3ec Binary files /dev/null and b/docs/_images/image2023-11-7_14-54-8.png differ diff --git a/docs/_images/image2023-11-7_15-1-59.png b/docs/_images/image2023-11-7_15-1-59.png new file mode 100644 index 0000000..2ea94cf Binary files /dev/null and b/docs/_images/image2023-11-7_15-1-59.png differ diff --git a/docs/_images/image2023-11-7_15-15-23.png b/docs/_images/image2023-11-7_15-15-23.png new file mode 100644 index 0000000..940f653 Binary files /dev/null and b/docs/_images/image2023-11-7_15-15-23.png differ diff --git a/docs/_images/image2023-11-7_15-16-10.png b/docs/_images/image2023-11-7_15-16-10.png new file mode 100644 index 0000000..948a34b Binary files /dev/null and b/docs/_images/image2023-11-7_15-16-10.png differ diff --git a/docs/_images/image2023-11-7_15-38-40.png b/docs/_images/image2023-11-7_15-38-40.png new file mode 100644 index 0000000..f02f7e6 Binary files /dev/null and b/docs/_images/image2023-11-7_15-38-40.png differ diff --git a/docs/_images/image2023-2-15_16-41-49.png b/docs/_images/image2023-2-15_16-41-49.png new file mode 100644 index 0000000..136503f Binary files /dev/null and b/docs/_images/image2023-2-15_16-41-49.png differ diff --git a/docs/_images/image2023-2-15_17-50-44.png b/docs/_images/image2023-2-15_17-50-44.png new file mode 100644 index 0000000..d29f4c1 Binary files /dev/null and b/docs/_images/image2023-2-15_17-50-44.png differ diff --git a/docs/_images/image2023-2-15_18-13-51.png b/docs/_images/image2023-2-15_18-13-51.png new file mode 100644 index 0000000..0867ce2 Binary files /dev/null and b/docs/_images/image2023-2-15_18-13-51.png differ diff --git a/docs/_images/image2023-2-6_15-25-4.png b/docs/_images/image2023-2-6_15-25-4.png new file mode 100644 index 0000000..4045be3 Binary files /dev/null and b/docs/_images/image2023-2-6_15-25-4.png differ diff --git a/docs/_images/image2023-4-4_13-28-40.png b/docs/_images/image2023-4-4_13-28-40.png new file mode 100644 index 0000000..5258a88 Binary files /dev/null and b/docs/_images/image2023-4-4_13-28-40.png differ diff --git a/docs/_images/image2023-4-4_13-37-48.png b/docs/_images/image2023-4-4_13-37-48.png new file mode 100644 index 0000000..219f51c Binary files /dev/null and b/docs/_images/image2023-4-4_13-37-48.png differ diff --git a/docs/_images/image2023-6-14_15-24-46.png b/docs/_images/image2023-6-14_15-24-46.png new file mode 100644 index 0000000..5f57b0c Binary files /dev/null and b/docs/_images/image2023-6-14_15-24-46.png differ diff --git a/docs/_images/image2023-6-14_15-26-51.png b/docs/_images/image2023-6-14_15-26-51.png new file mode 100644 index 0000000..6358a79 Binary files /dev/null and b/docs/_images/image2023-6-14_15-26-51.png differ diff --git a/docs/_images/image2023-6-14_15-29-22.png b/docs/_images/image2023-6-14_15-29-22.png new file mode 100644 index 0000000..9cf5cfb Binary files /dev/null and b/docs/_images/image2023-6-14_15-29-22.png differ diff --git a/docs/_images/image2023-6-14_15-40-56.png b/docs/_images/image2023-6-14_15-40-56.png new file mode 100644 index 0000000..8741dde Binary files /dev/null and b/docs/_images/image2023-6-14_15-40-56.png differ diff --git a/docs/_images/image2023-6-14_16-41-7.png b/docs/_images/image2023-6-14_16-41-7.png new file mode 100644 index 0000000..7973ba5 Binary files /dev/null and b/docs/_images/image2023-6-14_16-41-7.png differ diff --git a/docs/_images/image2023-6-14_16-8-44.png b/docs/_images/image2023-6-14_16-8-44.png new file mode 100644 index 0000000..478dde5 Binary files /dev/null and b/docs/_images/image2023-6-14_16-8-44.png differ diff --git a/docs/_images/image2023-6-15_8-43-7.png b/docs/_images/image2023-6-15_8-43-7.png new file mode 100644 index 0000000..c479c01 Binary files /dev/null and b/docs/_images/image2023-6-15_8-43-7.png differ diff --git a/docs/_images/image2023-6-1_17-6-3.png b/docs/_images/image2023-6-1_17-6-3.png new file mode 100644 index 0000000..cb4d712 Binary files /dev/null and b/docs/_images/image2023-6-1_17-6-3.png differ diff --git a/docs/_images/image2023-6-1_17-8-5.png b/docs/_images/image2023-6-1_17-8-5.png new file mode 100644 index 0000000..1073001 Binary files /dev/null and b/docs/_images/image2023-6-1_17-8-5.png differ diff --git a/docs/_images/image2023-6-26_11-27-0.png b/docs/_images/image2023-6-26_11-27-0.png new file mode 100644 index 0000000..cd3da9f Binary files /dev/null and b/docs/_images/image2023-6-26_11-27-0.png differ diff --git a/docs/_images/image2023-6-26_11-54-29.png b/docs/_images/image2023-6-26_11-54-29.png new file mode 100644 index 0000000..20d1e24 Binary files /dev/null and b/docs/_images/image2023-6-26_11-54-29.png differ diff --git a/docs/_images/image2023-6-26_12-0-35.png b/docs/_images/image2023-6-26_12-0-35.png new file mode 100644 index 0000000..f102086 Binary files /dev/null and b/docs/_images/image2023-6-26_12-0-35.png differ diff --git a/docs/_images/image2023-6-26_12-36-24.png b/docs/_images/image2023-6-26_12-36-24.png new file mode 100644 index 0000000..2c81eb2 Binary files /dev/null and b/docs/_images/image2023-6-26_12-36-24.png differ diff --git a/docs/_images/image2023-6-26_12-42-24.png b/docs/_images/image2023-6-26_12-42-24.png new file mode 100644 index 0000000..6685c0a Binary files /dev/null and b/docs/_images/image2023-6-26_12-42-24.png differ diff --git a/docs/_images/image2023-7-20_11-58-22.png b/docs/_images/image2023-7-20_11-58-22.png new file mode 100644 index 0000000..578b33a Binary files /dev/null and b/docs/_images/image2023-7-20_11-58-22.png differ diff --git a/docs/_images/image2023-8-2_16-11-43.png b/docs/_images/image2023-8-2_16-11-43.png new file mode 100644 index 0000000..e541fb5 Binary files /dev/null and b/docs/_images/image2023-8-2_16-11-43.png differ diff --git a/docs/_images/image2023-8-2_16-36-11.png b/docs/_images/image2023-8-2_16-36-11.png new file mode 100644 index 0000000..50a74dc Binary files /dev/null and b/docs/_images/image2023-8-2_16-36-11.png differ diff --git a/docs/_images/image2023-8-2_16-44-28.png b/docs/_images/image2023-8-2_16-44-28.png new file mode 100644 index 0000000..8897a6b Binary files /dev/null and b/docs/_images/image2023-8-2_16-44-28.png differ diff --git a/docs/_images/image2023-8-2_16-7-51.png b/docs/_images/image2023-8-2_16-7-51.png new file mode 100644 index 0000000..7d5865e Binary files /dev/null and b/docs/_images/image2023-8-2_16-7-51.png differ diff --git a/docs/_images/image2023-8-3_14-41-56.png b/docs/_images/image2023-8-3_14-41-56.png new file mode 100644 index 0000000..425efb7 Binary files /dev/null and b/docs/_images/image2023-8-3_14-41-56.png differ diff --git a/docs/_images/image2023-8-3_15-11-48.png b/docs/_images/image2023-8-3_15-11-48.png new file mode 100644 index 0000000..ee4d963 Binary files /dev/null and b/docs/_images/image2023-8-3_15-11-48.png differ diff --git a/docs/_images/image2023-8-8_14-2-4.png b/docs/_images/image2023-8-8_14-2-4.png new file mode 100644 index 0000000..0254a2b Binary files /dev/null and b/docs/_images/image2023-8-8_14-2-4.png differ diff --git a/docs/_images/image2023-8-8_14-4-40.png b/docs/_images/image2023-8-8_14-4-40.png new file mode 100644 index 0000000..f0d06ac Binary files /dev/null and b/docs/_images/image2023-8-8_14-4-40.png differ diff --git a/docs/_images/image_options_explanation.png b/docs/_images/image_options_explanation.png new file mode 100644 index 0000000..7bc8374 Binary files /dev/null and b/docs/_images/image_options_explanation.png differ diff --git a/docs/_images/importdashboard.png b/docs/_images/importdashboard.png new file mode 100644 index 0000000..77e0bf7 Binary files /dev/null and b/docs/_images/importdashboard.png differ diff --git a/docs/_images/install-cron-1.png b/docs/_images/install-cron-1.png new file mode 100644 index 0000000..4df7f88 Binary files /dev/null and b/docs/_images/install-cron-1.png differ diff --git a/docs/_images/install-cron-2.png b/docs/_images/install-cron-2.png new file mode 100644 index 0000000..2e748b1 Binary files /dev/null and b/docs/_images/install-cron-2.png differ diff --git a/docs/_images/install-cron-mulitple-1.png b/docs/_images/install-cron-mulitple-1.png new file mode 100644 index 0000000..058c642 Binary files /dev/null and b/docs/_images/install-cron-mulitple-1.png differ diff --git a/docs/_images/install-s3cmd-linux-01_creodias.png b/docs/_images/install-s3cmd-linux-01_creodias.png new file mode 100644 index 0000000..e6251ac Binary files /dev/null and b/docs/_images/install-s3cmd-linux-01_creodias.png differ diff --git a/docs/_images/install-s3cmd-linux-02_creodias.png b/docs/_images/install-s3cmd-linux-02_creodias.png new file mode 100644 index 0000000..866a0d9 Binary files /dev/null and b/docs/_images/install-s3cmd-linux-02_creodias.png differ diff --git a/docs/_images/install_new_pip.png b/docs/_images/install_new_pip.png new file mode 100644 index 0000000..49e34a2 Binary files /dev/null and b/docs/_images/install_new_pip.png differ diff --git a/docs/_images/install_noobaa_locally.png b/docs/_images/install_noobaa_locally.png new file mode 100644 index 0000000..9a243b8 Binary files /dev/null and b/docs/_images/install_noobaa_locally.png differ diff --git a/docs/_images/installation_done.png b/docs/_images/installation_done.png new file mode 100644 index 0000000..8cb081d Binary files /dev/null and b/docs/_images/installation_done.png differ diff --git a/docs/_images/installation_of_velero.png b/docs/_images/installation_of_velero.png new file mode 100644 index 0000000..a2ea8b8 Binary files /dev/null and b/docs/_images/installation_of_velero.png differ diff --git a/docs/_images/installed_mybackup2.png b/docs/_images/installed_mybackup2.png new file mode 100644 index 0000000..ecbae6b Binary files /dev/null and b/docs/_images/installed_mybackup2.png differ diff --git a/docs/_images/instance.png b/docs/_images/instance.png new file mode 100644 index 0000000..c05eff9 Binary files /dev/null and b/docs/_images/instance.png differ diff --git a/docs/_images/instance_blue_green.png b/docs/_images/instance_blue_green.png new file mode 100644 index 0000000..d1cd996 Binary files /dev/null and b/docs/_images/instance_blue_green.png differ diff --git a/docs/_images/instance_ephemeral_create_snapshot.png b/docs/_images/instance_ephemeral_create_snapshot.png new file mode 100644 index 0000000..0fbc2ba Binary files /dev/null and b/docs/_images/instance_ephemeral_create_snapshot.png differ diff --git a/docs/_images/instance_ephemeral_shut_off.png b/docs/_images/instance_ephemeral_shut_off.png new file mode 100644 index 0000000..b4847fb Binary files /dev/null and b/docs/_images/instance_ephemeral_shut_off.png differ diff --git a/docs/_images/instance_ephemeral_snapshot.png b/docs/_images/instance_ephemeral_snapshot.png new file mode 100644 index 0000000..e2b017c Binary files /dev/null and b/docs/_images/instance_ephemeral_snapshot.png differ diff --git a/docs/_images/instance_persistent_active_0bytes.png b/docs/_images/instance_persistent_active_0bytes.png new file mode 100644 index 0000000..7f98bfa Binary files /dev/null and b/docs/_images/instance_persistent_active_0bytes.png differ diff --git a/docs/_images/instance_persistent_create_shanpshot_button.png b/docs/_images/instance_persistent_create_shanpshot_button.png new file mode 100644 index 0000000..aacb1d0 Binary files /dev/null and b/docs/_images/instance_persistent_create_shanpshot_button.png differ diff --git a/docs/_images/instance_persistent_created.png b/docs/_images/instance_persistent_created.png new file mode 100644 index 0000000..688d9b6 Binary files /dev/null and b/docs/_images/instance_persistent_created.png differ diff --git a/docs/_images/instance_persistent_new_name.png b/docs/_images/instance_persistent_new_name.png new file mode 100644 index 0000000..923959a Binary files /dev/null and b/docs/_images/instance_persistent_new_name.png differ diff --git a/docs/_images/instance_persistent_show_data.png b/docs/_images/instance_persistent_show_data.png new file mode 100644 index 0000000..0855030 Binary files /dev/null and b/docs/_images/instance_persistent_show_data.png differ diff --git a/docs/_images/instance_persistent_shut_down_indees.png b/docs/_images/instance_persistent_shut_down_indees.png new file mode 100644 index 0000000..400a4c5 Binary files /dev/null and b/docs/_images/instance_persistent_shut_down_indees.png differ diff --git a/docs/_images/instance_persistent_volume_shapshot.png b/docs/_images/instance_persistent_volume_shapshot.png new file mode 100644 index 0000000..b7d5740 Binary files /dev/null and b/docs/_images/instance_persistent_volume_shapshot.png differ diff --git a/docs/_images/instance_persistent_volumes_volumes.png b/docs/_images/instance_persistent_volumes_volumes.png new file mode 100644 index 0000000..11197f8 Binary files /dev/null and b/docs/_images/instance_persistent_volumes_volumes.png differ diff --git a/docs/_images/instances.png b/docs/_images/instances.png new file mode 100644 index 0000000..76578ab Binary files /dev/null and b/docs/_images/instances.png differ diff --git a/docs/_images/inv_01_cloudferrocloud.png b/docs/_images/inv_01_cloudferrocloud.png new file mode 100644 index 0000000..025f90d Binary files /dev/null and b/docs/_images/inv_01_cloudferrocloud.png differ diff --git a/docs/_images/inv_02_cloudferrocloud.png b/docs/_images/inv_02_cloudferrocloud.png new file mode 100644 index 0000000..83e2bdc Binary files /dev/null and b/docs/_images/inv_02_cloudferrocloud.png differ diff --git a/docs/_images/ip_address_from_article.png b/docs/_images/ip_address_from_article.png new file mode 100644 index 0000000..8c9624d Binary files /dev/null and b/docs/_images/ip_address_from_article.png differ diff --git a/docs/_images/jq_error.png b/docs/_images/jq_error.png new file mode 100644 index 0000000..6ebf2e2 Binary files /dev/null and b/docs/_images/jq_error.png differ diff --git a/docs/_images/keepassxc_01_creodias.png b/docs/_images/keepassxc_01_creodias.png new file mode 100644 index 0000000..d087a48 Binary files /dev/null and b/docs/_images/keepassxc_01_creodias.png differ diff --git a/docs/_images/keepassxc_02_creodias.png b/docs/_images/keepassxc_02_creodias.png new file mode 100644 index 0000000..483921d Binary files /dev/null and b/docs/_images/keepassxc_02_creodias.png differ diff --git a/docs/_images/keepassxc_03_creodias.png b/docs/_images/keepassxc_03_creodias.png new file mode 100644 index 0000000..725c644 Binary files /dev/null and b/docs/_images/keepassxc_03_creodias.png differ diff --git a/docs/_images/keepassxc_04_creodias.png b/docs/_images/keepassxc_04_creodias.png new file mode 100644 index 0000000..9e999f4 Binary files /dev/null and b/docs/_images/keepassxc_04_creodias.png differ diff --git a/docs/_images/keepassxc_05_creodias.png b/docs/_images/keepassxc_05_creodias.png new file mode 100644 index 0000000..b9e5358 Binary files /dev/null and b/docs/_images/keepassxc_05_creodias.png differ diff --git a/docs/_images/keepassxc_06_creodias.png b/docs/_images/keepassxc_06_creodias.png new file mode 100644 index 0000000..05442ce Binary files /dev/null and b/docs/_images/keepassxc_06_creodias.png differ diff --git a/docs/_images/keepassxc_07_creodias.png b/docs/_images/keepassxc_07_creodias.png new file mode 100644 index 0000000..507252e Binary files /dev/null and b/docs/_images/keepassxc_07_creodias.png differ diff --git a/docs/_images/keepassxc_08_creodias.png b/docs/_images/keepassxc_08_creodias.png new file mode 100644 index 0000000..6231c7f Binary files /dev/null and b/docs/_images/keepassxc_08_creodias.png differ diff --git a/docs/_images/keepassxc_09_creodias.png b/docs/_images/keepassxc_09_creodias.png new file mode 100644 index 0000000..dcfa2db Binary files /dev/null and b/docs/_images/keepassxc_09_creodias.png differ diff --git a/docs/_images/keepassxc_10_creodias.png b/docs/_images/keepassxc_10_creodias.png new file mode 100644 index 0000000..e8c6c2b Binary files /dev/null and b/docs/_images/keepassxc_10_creodias.png differ diff --git a/docs/_images/keepassxc_11_creodias.png b/docs/_images/keepassxc_11_creodias.png new file mode 100644 index 0000000..89de0de Binary files /dev/null and b/docs/_images/keepassxc_11_creodias.png differ diff --git a/docs/_images/key-location-putty.png b/docs/_images/key-location-putty.png new file mode 100644 index 0000000..3655722 Binary files /dev/null and b/docs/_images/key-location-putty.png differ diff --git a/docs/_images/keycloack_full_screen.png b/docs/_images/keycloack_full_screen.png new file mode 100644 index 0000000..b774125 Binary files /dev/null and b/docs/_images/keycloack_full_screen.png differ diff --git a/docs/_images/keypair1.png b/docs/_images/keypair1.png new file mode 100644 index 0000000..ce215a0 Binary files /dev/null and b/docs/_images/keypair1.png differ diff --git a/docs/_images/keypair2.png b/docs/_images/keypair2.png new file mode 100644 index 0000000..bd11136 Binary files /dev/null and b/docs/_images/keypair2.png differ diff --git a/docs/_images/keypair3.png b/docs/_images/keypair3.png new file mode 100644 index 0000000..d496bba Binary files /dev/null and b/docs/_images/keypair3.png differ diff --git a/docs/_images/keypair4.png b/docs/_images/keypair4.png new file mode 100644 index 0000000..8b8d517 Binary files /dev/null and b/docs/_images/keypair4.png differ diff --git a/docs/_images/keypair5.png b/docs/_images/keypair5.png new file mode 100644 index 0000000..31e9769 Binary files /dev/null and b/docs/_images/keypair5.png differ diff --git a/docs/_images/ku_blanks.png b/docs/_images/ku_blanks.png new file mode 100644 index 0000000..33bb567 Binary files /dev/null and b/docs/_images/ku_blanks.png differ diff --git a/docs/_images/ku_blanks_ok.png b/docs/_images/ku_blanks_ok.png new file mode 100644 index 0000000..5297ce1 Binary files /dev/null and b/docs/_images/ku_blanks_ok.png differ diff --git a/docs/_images/ku_labels_broken.png b/docs/_images/ku_labels_broken.png new file mode 100644 index 0000000..ef014ef Binary files /dev/null and b/docs/_images/ku_labels_broken.png differ diff --git a/docs/_images/ku_long_line.png b/docs/_images/ku_long_line.png new file mode 100644 index 0000000..cc798e9 Binary files /dev/null and b/docs/_images/ku_long_line.png differ diff --git a/docs/_images/ku_no_blanks.png b/docs/_images/ku_no_blanks.png new file mode 100644 index 0000000..895950d Binary files /dev/null and b/docs/_images/ku_no_blanks.png differ diff --git a/docs/_images/ku_openstack_line_entry.png b/docs/_images/ku_openstack_line_entry.png new file mode 100644 index 0000000..c0d98a6 Binary files /dev/null and b/docs/_images/ku_openstack_line_entry.png differ diff --git a/docs/_images/kubectl_get_node.png b/docs/_images/kubectl_get_node.png new file mode 100644 index 0000000..0c3a7af Binary files /dev/null and b/docs/_images/kubectl_get_node.png differ diff --git a/docs/_images/kubectl_help.png b/docs/_images/kubectl_help.png new file mode 100644 index 0000000..f12dc90 Binary files /dev/null and b/docs/_images/kubectl_help.png differ diff --git a/docs/_images/kubectl_show_5_workers.png b/docs/_images/kubectl_show_5_workers.png new file mode 100644 index 0000000..2358630 Binary files /dev/null and b/docs/_images/kubectl_show_5_workers.png differ diff --git a/docs/_images/kubectl_without_access.png b/docs/_images/kubectl_without_access.png new file mode 100644 index 0000000..8c306a7 Binary files /dev/null and b/docs/_images/kubectl_without_access.png differ diff --git a/docs/_images/kubectl_working.png b/docs/_images/kubectl_working.png new file mode 100644 index 0000000..cd6965a Binary files /dev/null and b/docs/_images/kubectl_working.png differ diff --git a/docs/_images/kubernetes_url.png b/docs/_images/kubernetes_url.png new file mode 100644 index 0000000..74cb59f Binary files /dev/null and b/docs/_images/kubernetes_url.png differ diff --git a/docs/_images/labels.png b/docs/_images/labels.png new file mode 100644 index 0000000..89da2eb Binary files /dev/null and b/docs/_images/labels.png differ diff --git a/docs/_images/launch_instance.png b/docs/_images/launch_instance.png new file mode 100644 index 0000000..c18545d Binary files /dev/null and b/docs/_images/launch_instance.png differ diff --git a/docs/_images/launch_instance_created_instances.png b/docs/_images/launch_instance_created_instances.png new file mode 100644 index 0000000..6a38338 Binary files /dev/null and b/docs/_images/launch_instance_created_instances.png differ diff --git a/docs/_images/launch_instance_details.png b/docs/_images/launch_instance_details.png new file mode 100644 index 0000000..3fe98a9 Binary files /dev/null and b/docs/_images/launch_instance_details.png differ diff --git a/docs/_images/launch_instance_flavor.png b/docs/_images/launch_instance_flavor.png new file mode 100644 index 0000000..ef5b25e Binary files /dev/null and b/docs/_images/launch_instance_flavor.png differ diff --git a/docs/_images/launch_instance_key_pair.png b/docs/_images/launch_instance_key_pair.png new file mode 100644 index 0000000..11c1938 Binary files /dev/null and b/docs/_images/launch_instance_key_pair.png differ diff --git a/docs/_images/launch_instance_launch_instance.png b/docs/_images/launch_instance_launch_instance.png new file mode 100644 index 0000000..e62c1ec Binary files /dev/null and b/docs/_images/launch_instance_launch_instance.png differ diff --git a/docs/_images/launch_instance_networks.png b/docs/_images/launch_instance_networks.png new file mode 100644 index 0000000..6953171 Binary files /dev/null and b/docs/_images/launch_instance_networks.png differ diff --git a/docs/_images/launch_instance_security_groups.png b/docs/_images/launch_instance_security_groups.png new file mode 100644 index 0000000..433faab Binary files /dev/null and b/docs/_images/launch_instance_security_groups.png differ diff --git a/docs/_images/launch_instance_source.png b/docs/_images/launch_instance_source.png new file mode 100644 index 0000000..7b5197f Binary files /dev/null and b/docs/_images/launch_instance_source.png differ diff --git a/docs/_images/launch_stack.png b/docs/_images/launch_stack.png new file mode 100644 index 0000000..6eb55d7 Binary files /dev/null and b/docs/_images/launch_stack.png differ diff --git a/docs/_images/linux-gui-03_creodias.png b/docs/_images/linux-gui-03_creodias.png new file mode 100644 index 0000000..017f89e Binary files /dev/null and b/docs/_images/linux-gui-03_creodias.png differ diff --git a/docs/_images/linux-gui-04_creodias.png b/docs/_images/linux-gui-04_creodias.png new file mode 100644 index 0000000..b62d99f Binary files /dev/null and b/docs/_images/linux-gui-04_creodias.png differ diff --git a/docs/_images/linux-gui-05_creodias.png b/docs/_images/linux-gui-05_creodias.png new file mode 100644 index 0000000..1b65527 Binary files /dev/null and b/docs/_images/linux-gui-05_creodias.png differ diff --git a/docs/_images/linux-gui-06_creodias.png b/docs/_images/linux-gui-06_creodias.png new file mode 100644 index 0000000..a7c5d86 Binary files /dev/null and b/docs/_images/linux-gui-06_creodias.png differ diff --git a/docs/_images/linux-gui-07_creodias.png b/docs/_images/linux-gui-07_creodias.png new file mode 100644 index 0000000..bd8cbfc Binary files /dev/null and b/docs/_images/linux-gui-07_creodias.png differ diff --git a/docs/_images/linux-gui-08_creodias.png b/docs/_images/linux-gui-08_creodias.png new file mode 100644 index 0000000..71c1d62 Binary files /dev/null and b/docs/_images/linux-gui-08_creodias.png differ diff --git a/docs/_images/linux-gui-09_creodias.png b/docs/_images/linux-gui-09_creodias.png new file mode 100644 index 0000000..520a061 Binary files /dev/null and b/docs/_images/linux-gui-09_creodias.png differ diff --git a/docs/_images/linux-gui-11_creodias.png b/docs/_images/linux-gui-11_creodias.png new file mode 100644 index 0000000..4076c27 Binary files /dev/null and b/docs/_images/linux-gui-11_creodias.png differ diff --git a/docs/_images/linux-gui-12_creodias.png b/docs/_images/linux-gui-12_creodias.png new file mode 100644 index 0000000..4463f6a Binary files /dev/null and b/docs/_images/linux-gui-12_creodias.png differ diff --git a/docs/_images/linux-gui-13_creodias.png b/docs/_images/linux-gui-13_creodias.png new file mode 100644 index 0000000..5b3bc09 Binary files /dev/null and b/docs/_images/linux-gui-13_creodias.png differ diff --git a/docs/_images/linux-gui-14_creodias.png b/docs/_images/linux-gui-14_creodias.png new file mode 100644 index 0000000..8c9000c Binary files /dev/null and b/docs/_images/linux-gui-14_creodias.png differ diff --git a/docs/_images/linux-gui-15_creodias.png b/docs/_images/linux-gui-15_creodias.png new file mode 100644 index 0000000..4d80e9e Binary files /dev/null and b/docs/_images/linux-gui-15_creodias.png differ diff --git a/docs/_images/linux-gui-16_creodias.png b/docs/_images/linux-gui-16_creodias.png new file mode 100644 index 0000000..7f85b9e Binary files /dev/null and b/docs/_images/linux-gui-16_creodias.png differ diff --git a/docs/_images/linux-gui-17_creodias.png b/docs/_images/linux-gui-17_creodias.png new file mode 100644 index 0000000..47089ae Binary files /dev/null and b/docs/_images/linux-gui-17_creodias.png differ diff --git a/docs/_images/listing_nodegroups.png b/docs/_images/listing_nodegroups.png new file mode 100644 index 0000000..d7955c8 Binary files /dev/null and b/docs/_images/listing_nodegroups.png differ diff --git a/docs/_images/locust_test.png b/docs/_images/locust_test.png new file mode 100644 index 0000000..4ff31ca Binary files /dev/null and b/docs/_images/locust_test.png differ diff --git a/docs/_images/login_cloudferrocloud.png b/docs/_images/login_cloudferrocloud.png new file mode 100644 index 0000000..0e0369f Binary files /dev/null and b/docs/_images/login_cloudferrocloud.png differ diff --git a/docs/_images/manage-totp-01_creodias.png b/docs/_images/manage-totp-01_creodias.png new file mode 100644 index 0000000..515d92d Binary files /dev/null and b/docs/_images/manage-totp-01_creodias.png differ diff --git a/docs/_images/manage-totp-02_creodias.png b/docs/_images/manage-totp-02_creodias.png new file mode 100644 index 0000000..369eec0 Binary files /dev/null and b/docs/_images/manage-totp-02_creodias.png differ diff --git a/docs/_images/manage-totp-03_creodias.png b/docs/_images/manage-totp-03_creodias.png new file mode 100644 index 0000000..952e916 Binary files /dev/null and b/docs/_images/manage-totp-03_creodias.png differ diff --git a/docs/_images/manage-totp-04_creodias.png b/docs/_images/manage-totp-04_creodias.png new file mode 100644 index 0000000..0748ebe Binary files /dev/null and b/docs/_images/manage-totp-04_creodias.png differ diff --git a/docs/_images/manage-totp-05_cloudferrocloud.png b/docs/_images/manage-totp-05_cloudferrocloud.png new file mode 100644 index 0000000..c94fd0b Binary files /dev/null and b/docs/_images/manage-totp-05_cloudferrocloud.png differ diff --git a/docs/_images/management.png b/docs/_images/management.png new file mode 100644 index 0000000..4ccb216 Binary files /dev/null and b/docs/_images/management.png differ diff --git a/docs/_images/master_node_addresses.png b/docs/_images/master_node_addresses.png new file mode 100644 index 0000000..a5481b4 Binary files /dev/null and b/docs/_images/master_node_addresses.png differ diff --git a/docs/_images/mount-eodata-windows-open-03_creodias.png b/docs/_images/mount-eodata-windows-open-03_creodias.png new file mode 100644 index 0000000..664a0c3 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-03_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-04_creodias.png b/docs/_images/mount-eodata-windows-open-04_creodias.png new file mode 100644 index 0000000..c77b904 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-04_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-05_creodias.png b/docs/_images/mount-eodata-windows-open-05_creodias.png new file mode 100644 index 0000000..a6d6903 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-05_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-06_creodias.png b/docs/_images/mount-eodata-windows-open-06_creodias.png new file mode 100644 index 0000000..8590e59 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-06_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-07_creodias.png b/docs/_images/mount-eodata-windows-open-07_creodias.png new file mode 100644 index 0000000..2b35cbb Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-07_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-10_creodias.png b/docs/_images/mount-eodata-windows-open-10_creodias.png new file mode 100644 index 0000000..eea5406 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-10_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-11_creodias.png b/docs/_images/mount-eodata-windows-open-11_creodias.png new file mode 100644 index 0000000..fd8e970 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-11_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-12_creodias.png b/docs/_images/mount-eodata-windows-open-12_creodias.png new file mode 100644 index 0000000..18022ec Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-12_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-13_creodias.png b/docs/_images/mount-eodata-windows-open-13_creodias.png new file mode 100644 index 0000000..dac4ffd Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-13_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-nssm-01_creodias.png b/docs/_images/mount-eodata-windows-open-nssm-01_creodias.png new file mode 100644 index 0000000..a43bb1d Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-nssm-01_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-01_creodias.png b/docs/_images/mount-eodata-windows-open-remove-01_creodias.png new file mode 100644 index 0000000..b0157d7 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-01_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-03_creodias.png b/docs/_images/mount-eodata-windows-open-remove-03_creodias.png new file mode 100644 index 0000000..35f2b7d Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-03_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-04_creodias.png b/docs/_images/mount-eodata-windows-open-remove-04_creodias.png new file mode 100644 index 0000000..22e3658 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-04_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-05_creodias.png b/docs/_images/mount-eodata-windows-open-remove-05_creodias.png new file mode 100644 index 0000000..0c72467 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-05_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-06_creodias.png b/docs/_images/mount-eodata-windows-open-remove-06_creodias.png new file mode 100644 index 0000000..ad1023a Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-06_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-07_creodias.png b/docs/_images/mount-eodata-windows-open-remove-07_creodias.png new file mode 100644 index 0000000..75e01e4 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-07_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-open-remove-08_creodias.png b/docs/_images/mount-eodata-windows-open-remove-08_creodias.png new file mode 100644 index 0000000..4c65039 Binary files /dev/null and b/docs/_images/mount-eodata-windows-open-remove-08_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-rclone-01_creodias.png b/docs/_images/mount-eodata-windows-rclone-01_creodias.png new file mode 100644 index 0000000..7813cde Binary files /dev/null and b/docs/_images/mount-eodata-windows-rclone-01_creodias.png differ diff --git a/docs/_images/mount-eodata-windows-rclone-02_creodias.png b/docs/_images/mount-eodata-windows-rclone-02_creodias.png new file mode 100644 index 0000000..fea2d7a Binary files /dev/null and b/docs/_images/mount-eodata-windows-rclone-02_creodias.png differ diff --git a/docs/_images/mount-object-storage-s3fs-linux-03_creodias.png b/docs/_images/mount-object-storage-s3fs-linux-03_creodias.png new file mode 100644 index 0000000..9e37bf8 Binary files /dev/null and b/docs/_images/mount-object-storage-s3fs-linux-03_creodias.png differ diff --git a/docs/_images/mount-object-storage-s3fs-linux-04_creodias.png b/docs/_images/mount-object-storage-s3fs-linux-04_creodias.png new file mode 100644 index 0000000..7c88fa9 Binary files /dev/null and b/docs/_images/mount-object-storage-s3fs-linux-04_creodias.png differ diff --git a/docs/_images/mount-object-storage-s3fs-linux-05_creodias.png b/docs/_images/mount-object-storage-s3fs-linux-05_creodias.png new file mode 100644 index 0000000..3e5c1fd Binary files /dev/null and b/docs/_images/mount-object-storage-s3fs-linux-05_creodias.png differ diff --git a/docs/_images/mount-object-storage-s3fs-linux-06_creodias.png b/docs/_images/mount-object-storage-s3fs-linux-06_creodias.png new file mode 100644 index 0000000..4b309e2 Binary files /dev/null and b/docs/_images/mount-object-storage-s3fs-linux-06_creodias.png differ diff --git a/docs/_images/mount-object-storage-windows-horizon-01_creodias.png b/docs/_images/mount-object-storage-windows-horizon-01_creodias.png new file mode 100644 index 0000000..af0a35f Binary files /dev/null and b/docs/_images/mount-object-storage-windows-horizon-01_creodias.png differ diff --git a/docs/_images/nano_redis_yaml.png b/docs/_images/nano_redis_yaml.png new file mode 100644 index 0000000..e79c91a Binary files /dev/null and b/docs/_images/nano_redis_yaml.png differ diff --git a/docs/_images/nano_values.png b/docs/_images/nano_values.png new file mode 100644 index 0000000..9661207 Binary files /dev/null and b/docs/_images/nano_values.png differ diff --git a/docs/_images/net1.png b/docs/_images/net1.png new file mode 100644 index 0000000..dc2a836 Binary files /dev/null and b/docs/_images/net1.png differ diff --git a/docs/_images/net10.png b/docs/_images/net10.png new file mode 100644 index 0000000..b306b44 Binary files /dev/null and b/docs/_images/net10.png differ diff --git a/docs/_images/net11.png b/docs/_images/net11.png new file mode 100644 index 0000000..cf355ac Binary files /dev/null and b/docs/_images/net11.png differ diff --git a/docs/_images/net12.png b/docs/_images/net12.png new file mode 100644 index 0000000..fc00c00 Binary files /dev/null and b/docs/_images/net12.png differ diff --git a/docs/_images/net13.png b/docs/_images/net13.png new file mode 100644 index 0000000..ea58402 Binary files /dev/null and b/docs/_images/net13.png differ diff --git a/docs/_images/net2.png b/docs/_images/net2.png new file mode 100644 index 0000000..def68b1 Binary files /dev/null and b/docs/_images/net2.png differ diff --git a/docs/_images/net3.png b/docs/_images/net3.png new file mode 100644 index 0000000..d6c809e Binary files /dev/null and b/docs/_images/net3.png differ diff --git a/docs/_images/net4.png b/docs/_images/net4.png new file mode 100644 index 0000000..d3942b5 Binary files /dev/null and b/docs/_images/net4.png differ diff --git a/docs/_images/net5.png b/docs/_images/net5.png new file mode 100644 index 0000000..27cd944 Binary files /dev/null and b/docs/_images/net5.png differ diff --git a/docs/_images/net6.png b/docs/_images/net6.png new file mode 100644 index 0000000..675b60b Binary files /dev/null and b/docs/_images/net6.png differ diff --git a/docs/_images/net7.png b/docs/_images/net7.png new file mode 100644 index 0000000..49a14a3 Binary files /dev/null and b/docs/_images/net7.png differ diff --git a/docs/_images/net8.png b/docs/_images/net8.png new file mode 100644 index 0000000..e0fba30 Binary files /dev/null and b/docs/_images/net8.png differ diff --git a/docs/_images/net9.png b/docs/_images/net9.png new file mode 100644 index 0000000..12d990a Binary files /dev/null and b/docs/_images/net9.png differ diff --git a/docs/_images/network_list.png b/docs/_images/network_list.png new file mode 100644 index 0000000..8e264e9 Binary files /dev/null and b/docs/_images/network_list.png differ diff --git a/docs/_images/network_option.png b/docs/_images/network_option.png new file mode 100644 index 0000000..d4c03b1 Binary files /dev/null and b/docs/_images/network_option.png differ diff --git a/docs/_images/network_topology_with_labels.png b/docs/_images/network_topology_with_labels.png new file mode 100644 index 0000000..1856baf Binary files /dev/null and b/docs/_images/network_topology_with_labels.png differ diff --git a/docs/_images/networks5.png b/docs/_images/networks5.png new file mode 100644 index 0000000..ecb7064 Binary files /dev/null and b/docs/_images/networks5.png differ diff --git a/docs/_images/networks_list.png b/docs/_images/networks_list.png new file mode 100644 index 0000000..72a85ee Binary files /dev/null and b/docs/_images/networks_list.png differ diff --git a/docs/_images/new-s3cmd-download-69.png b/docs/_images/new-s3cmd-download-69.png new file mode 100644 index 0000000..2bc9866 Binary files /dev/null and b/docs/_images/new-s3cmd-download-69.png differ diff --git a/docs/_images/new_access_token.png b/docs/_images/new_access_token.png new file mode 100644 index 0000000..e0659ca Binary files /dev/null and b/docs/_images/new_access_token.png differ diff --git a/docs/_images/new_docker-1.png b/docs/_images/new_docker-1.png new file mode 100644 index 0000000..eb92fd4 Binary files /dev/null and b/docs/_images/new_docker-1.png differ diff --git a/docs/_images/new_docker-1.png.md b/docs/_images/new_docker-1.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/new_docker-1.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/new_instances2.png b/docs/_images/new_instances2.png new file mode 100644 index 0000000..1f1ea1a Binary files /dev/null and b/docs/_images/new_instances2.png differ diff --git a/docs/_images/new_project.png b/docs/_images/new_project.png new file mode 100644 index 0000000..1b262c1 Binary files /dev/null and b/docs/_images/new_project.png differ diff --git a/docs/_images/newvm1.png b/docs/_images/newvm1.png new file mode 100644 index 0000000..617e854 Binary files /dev/null and b/docs/_images/newvm1.png differ diff --git a/docs/_images/newvm10.png b/docs/_images/newvm10.png new file mode 100644 index 0000000..6141975 Binary files /dev/null and b/docs/_images/newvm10.png differ diff --git a/docs/_images/newvm11.png b/docs/_images/newvm11.png new file mode 100644 index 0000000..0cc36de Binary files /dev/null and b/docs/_images/newvm11.png differ diff --git a/docs/_images/newvm12.png b/docs/_images/newvm12.png new file mode 100644 index 0000000..372d82b Binary files /dev/null and b/docs/_images/newvm12.png differ diff --git a/docs/_images/newvm13.png b/docs/_images/newvm13.png new file mode 100644 index 0000000..ac11e96 Binary files /dev/null and b/docs/_images/newvm13.png differ diff --git a/docs/_images/newvm2.png b/docs/_images/newvm2.png new file mode 100644 index 0000000..844dc13 Binary files /dev/null and b/docs/_images/newvm2.png differ diff --git a/docs/_images/newvm3.png b/docs/_images/newvm3.png new file mode 100644 index 0000000..00f1245 Binary files /dev/null and b/docs/_images/newvm3.png differ diff --git a/docs/_images/newvm4.png b/docs/_images/newvm4.png new file mode 100644 index 0000000..efb42f0 Binary files /dev/null and b/docs/_images/newvm4.png differ diff --git a/docs/_images/newvm5.png b/docs/_images/newvm5.png new file mode 100644 index 0000000..cdcd817 Binary files /dev/null and b/docs/_images/newvm5.png differ diff --git a/docs/_images/newvm6.png b/docs/_images/newvm6.png new file mode 100644 index 0000000..1956266 Binary files /dev/null and b/docs/_images/newvm6.png differ diff --git a/docs/_images/newvm7.png b/docs/_images/newvm7.png new file mode 100644 index 0000000..07a8699 Binary files /dev/null and b/docs/_images/newvm7.png differ diff --git a/docs/_images/newvm8.png b/docs/_images/newvm8.png new file mode 100644 index 0000000..8e57f0d Binary files /dev/null and b/docs/_images/newvm8.png differ diff --git a/docs/_images/newvm9.png b/docs/_images/newvm9.png new file mode 100644 index 0000000..da05770 Binary files /dev/null and b/docs/_images/newvm9.png differ diff --git a/docs/_images/nfs_server_2049.png b/docs/_images/nfs_server_2049.png new file mode 100644 index 0000000..f082b3b Binary files /dev/null and b/docs/_images/nfs_server_2049.png differ diff --git a/docs/_images/nginx-backup.png b/docs/_images/nginx-backup.png new file mode 100644 index 0000000..aad9634 Binary files /dev/null and b/docs/_images/nginx-backup.png differ diff --git a/docs/_images/no-ingress-controller.png b/docs/_images/no-ingress-controller.png new file mode 100644 index 0000000..a82ef50 Binary files /dev/null and b/docs/_images/no-ingress-controller.png differ diff --git a/docs/_images/no_networks_present.png b/docs/_images/no_networks_present.png new file mode 100644 index 0000000..3640568 Binary files /dev/null and b/docs/_images/no_networks_present.png differ diff --git a/docs/_images/nodegroup_list_1.png b/docs/_images/nodegroup_list_1.png new file mode 100644 index 0000000..696991b Binary files /dev/null and b/docs/_images/nodegroup_list_1.png differ diff --git a/docs/_images/nodegroup_resized.png b/docs/_images/nodegroup_resized.png new file mode 100644 index 0000000..7c5ce61 Binary files /dev/null and b/docs/_images/nodegroup_resized.png differ diff --git a/docs/_images/nodegroup_with_added_role.png b/docs/_images/nodegroup_with_added_role.png new file mode 100644 index 0000000..123fd95 Binary files /dev/null and b/docs/_images/nodegroup_with_added_role.png differ diff --git a/docs/_images/nodegroups_in_cluster_id.png b/docs/_images/nodegroups_in_cluster_id.png new file mode 100644 index 0000000..64f0bc4 Binary files /dev/null and b/docs/_images/nodegroups_in_cluster_id.png differ diff --git a/docs/_images/nodegroups_network_graph.png b/docs/_images/nodegroups_network_graph.png new file mode 100644 index 0000000..243d730 Binary files /dev/null and b/docs/_images/nodegroups_network_graph.png differ diff --git a/docs/_images/nodes_address.png b/docs/_images/nodes_address.png new file mode 100644 index 0000000..8b0eba3 Binary files /dev/null and b/docs/_images/nodes_address.png differ diff --git a/docs/_images/noloadbalancer_created.png b/docs/_images/noloadbalancer_created.png new file mode 100644 index 0000000..4fc6e7b Binary files /dev/null and b/docs/_images/noloadbalancer_created.png differ diff --git a/docs/_images/number_of_master_nodes_filled_in.png b/docs/_images/number_of_master_nodes_filled_in.png new file mode 100644 index 0000000..1c41440 Binary files /dev/null and b/docs/_images/number_of_master_nodes_filled_in.png differ diff --git a/docs/_images/nvidia_chosen_cloudferro_cloud.png b/docs/_images/nvidia_chosen_cloudferro_cloud.png new file mode 100644 index 0000000..4c685da Binary files /dev/null and b/docs/_images/nvidia_chosen_cloudferro_cloud.png differ diff --git a/docs/_images/object-storage-windows-example1_creodias.png b/docs/_images/object-storage-windows-example1_creodias.png new file mode 100644 index 0000000..c62f609 Binary files /dev/null and b/docs/_images/object-storage-windows-example1_creodias.png differ diff --git a/docs/_images/object_create_container_name.png b/docs/_images/object_create_container_name.png new file mode 100644 index 0000000..0016af9 Binary files /dev/null and b/docs/_images/object_create_container_name.png differ diff --git a/docs/_images/object_list_backup09.png b/docs/_images/object_list_backup09.png new file mode 100644 index 0000000..130b04c Binary files /dev/null and b/docs/_images/object_list_backup09.png differ diff --git a/docs/_images/older_uuid.png b/docs/_images/older_uuid.png new file mode 100644 index 0000000..20402d7 Binary files /dev/null and b/docs/_images/older_uuid.png differ diff --git a/docs/_images/openstack-user-roles-create-4.png b/docs/_images/openstack-user-roles-create-4.png new file mode 100644 index 0000000..5a16423 Binary files /dev/null and b/docs/_images/openstack-user-roles-create-4.png differ diff --git a/docs/_images/openstack_cli.png b/docs/_images/openstack_cli.png new file mode 100644 index 0000000..90ae28f Binary files /dev/null and b/docs/_images/openstack_cli.png differ diff --git a/docs/_images/openstack_cli_install_linux_help.png b/docs/_images/openstack_cli_install_linux_help.png new file mode 100644 index 0000000..ab01c95 Binary files /dev/null and b/docs/_images/openstack_cli_install_linux_help.png differ diff --git a/docs/_images/openstack_coe.png b/docs/_images/openstack_coe.png new file mode 100644 index 0000000..b651cdf Binary files /dev/null and b/docs/_images/openstack_coe.png differ diff --git a/docs/_images/openstack_coe_cluster_list.png b/docs/_images/openstack_coe_cluster_list.png new file mode 100644 index 0000000..fb48053 Binary files /dev/null and b/docs/_images/openstack_coe_cluster_list.png differ diff --git a/docs/_images/openstack_container_create_help.png b/docs/_images/openstack_container_create_help.png new file mode 100644 index 0000000..91bbf0e Binary files /dev/null and b/docs/_images/openstack_container_create_help.png differ diff --git a/docs/_images/openstack_help.png b/docs/_images/openstack_help.png new file mode 100644 index 0000000..1940906 Binary files /dev/null and b/docs/_images/openstack_help.png differ diff --git a/docs/_images/openstack_server_create_help.png b/docs/_images/openstack_server_create_help.png new file mode 100644 index 0000000..4c43a72 Binary files /dev/null and b/docs/_images/openstack_server_create_help.png differ diff --git a/docs/_images/openstack_vim.png b/docs/_images/openstack_vim.png new file mode 100644 index 0000000..23ea6d9 Binary files /dev/null and b/docs/_images/openstack_vim.png differ diff --git a/docs/_images/openstackcli_flavor_list.png b/docs/_images/openstackcli_flavor_list.png new file mode 100644 index 0000000..7489515 Binary files /dev/null and b/docs/_images/openstackcli_flavor_list.png differ diff --git a/docs/_images/orch4.png b/docs/_images/orch4.png new file mode 100644 index 0000000..4f05245 Binary files /dev/null and b/docs/_images/orch4.png differ diff --git a/docs/_images/otp01.png b/docs/_images/otp01.png new file mode 100644 index 0000000..b3601f2 Binary files /dev/null and b/docs/_images/otp01.png differ diff --git a/docs/_images/otp01.png.md b/docs/_images/otp01.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp01.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp02.png b/docs/_images/otp02.png new file mode 100644 index 0000000..a0d3ddd Binary files /dev/null and b/docs/_images/otp02.png differ diff --git a/docs/_images/otp02.png.md b/docs/_images/otp02.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp02.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp03.png b/docs/_images/otp03.png new file mode 100644 index 0000000..2f36b3a Binary files /dev/null and b/docs/_images/otp03.png differ diff --git a/docs/_images/otp03.png.md b/docs/_images/otp03.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp03.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp04.png b/docs/_images/otp04.png new file mode 100644 index 0000000..e81e2c3 Binary files /dev/null and b/docs/_images/otp04.png differ diff --git a/docs/_images/otp04.png.md b/docs/_images/otp04.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp04.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp05.png b/docs/_images/otp05.png new file mode 100644 index 0000000..6268be4 Binary files /dev/null and b/docs/_images/otp05.png differ diff --git a/docs/_images/otp05.png.md b/docs/_images/otp05.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp05.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp07.png b/docs/_images/otp07.png new file mode 100644 index 0000000..a09cf67 Binary files /dev/null and b/docs/_images/otp07.png differ diff --git a/docs/_images/otp07.png.md b/docs/_images/otp07.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp07.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp08.png b/docs/_images/otp08.png new file mode 100644 index 0000000..93d5d21 Binary files /dev/null and b/docs/_images/otp08.png differ diff --git a/docs/_images/otp08.png.md b/docs/_images/otp08.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp08.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/otp09.png b/docs/_images/otp09.png new file mode 100644 index 0000000..18d0d6c Binary files /dev/null and b/docs/_images/otp09.png differ diff --git a/docs/_images/otp09.png.md b/docs/_images/otp09.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/otp09.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/overview.png b/docs/_images/overview.png new file mode 100644 index 0000000..ada7de7 Binary files /dev/null and b/docs/_images/overview.png differ diff --git a/docs/_images/owner_con.png b/docs/_images/owner_con.png new file mode 100644 index 0000000..1b2ec78 Binary files /dev/null and b/docs/_images/owner_con.png differ diff --git a/docs/_images/owner_login.png b/docs/_images/owner_login.png new file mode 100644 index 0000000..a4817dc Binary files /dev/null and b/docs/_images/owner_login.png differ diff --git a/docs/_images/owner_main.png b/docs/_images/owner_main.png new file mode 100644 index 0000000..e555081 Binary files /dev/null and b/docs/_images/owner_main.png differ diff --git a/docs/_images/owner_rc.png b/docs/_images/owner_rc.png new file mode 100644 index 0000000..e726557 Binary files /dev/null and b/docs/_images/owner_rc.png differ diff --git a/docs/_images/owner_upload_0.png b/docs/_images/owner_upload_0.png new file mode 100644 index 0000000..d510c2f Binary files /dev/null and b/docs/_images/owner_upload_0.png differ diff --git a/docs/_images/owner_upload_1.png b/docs/_images/owner_upload_1.png new file mode 100644 index 0000000..ff7debd Binary files /dev/null and b/docs/_images/owner_upload_1.png differ diff --git a/docs/_images/parameters.png b/docs/_images/parameters.png new file mode 100644 index 0000000..ea196f6 Binary files /dev/null and b/docs/_images/parameters.png differ diff --git a/docs/_images/pastebin1.png b/docs/_images/pastebin1.png new file mode 100644 index 0000000..fee625e Binary files /dev/null and b/docs/_images/pastebin1.png differ diff --git a/docs/_images/pastebin2.png b/docs/_images/pastebin2.png new file mode 100644 index 0000000..329d1aa Binary files /dev/null and b/docs/_images/pastebin2.png differ diff --git a/docs/_images/pastebin3.png b/docs/_images/pastebin3.png new file mode 100644 index 0000000..3056180 Binary files /dev/null and b/docs/_images/pastebin3.png differ diff --git a/docs/_images/pastebin4.png b/docs/_images/pastebin4.png new file mode 100644 index 0000000..918194b Binary files /dev/null and b/docs/_images/pastebin4.png differ diff --git a/docs/_images/pastebin5.png b/docs/_images/pastebin5.png new file mode 100644 index 0000000..69e2efe Binary files /dev/null and b/docs/_images/pastebin5.png differ diff --git a/docs/_images/present_clusters.png b/docs/_images/present_clusters.png new file mode 100644 index 0000000..507a08f Binary files /dev/null and b/docs/_images/present_clusters.png differ diff --git a/docs/_images/present_networks.png b/docs/_images/present_networks.png new file mode 100644 index 0000000..ddb3015 Binary files /dev/null and b/docs/_images/present_networks.png differ diff --git a/docs/_images/project1.png b/docs/_images/project1.png new file mode 100644 index 0000000..b122400 Binary files /dev/null and b/docs/_images/project1.png differ diff --git a/docs/_images/project2.png b/docs/_images/project2.png new file mode 100644 index 0000000..910554b Binary files /dev/null and b/docs/_images/project2.png differ diff --git a/docs/_images/projects.png b/docs/_images/projects.png new file mode 100644 index 0000000..67d44f8 Binary files /dev/null and b/docs/_images/projects.png differ diff --git a/docs/_images/projects_present.png b/docs/_images/projects_present.png new file mode 100644 index 0000000..c67bcc0 Binary files /dev/null and b/docs/_images/projects_present.png differ diff --git a/docs/_images/prometheus-dashboard_9090.png b/docs/_images/prometheus-dashboard_9090.png new file mode 100644 index 0000000..f90c367 Binary files /dev/null and b/docs/_images/prometheus-dashboard_9090.png differ diff --git a/docs/_images/putty-02.png b/docs/_images/putty-02.png new file mode 100644 index 0000000..7f4e059 Binary files /dev/null and b/docs/_images/putty-02.png differ diff --git a/docs/_images/putty-03.png b/docs/_images/putty-03.png new file mode 100644 index 0000000..37c307c Binary files /dev/null and b/docs/_images/putty-03.png differ diff --git a/docs/_images/putty-04.png b/docs/_images/putty-04.png new file mode 100644 index 0000000..c819283 Binary files /dev/null and b/docs/_images/putty-04.png differ diff --git a/docs/_images/putty-05.png b/docs/_images/putty-05.png new file mode 100644 index 0000000..3e619ed Binary files /dev/null and b/docs/_images/putty-05.png differ diff --git a/docs/_images/putty-06.png b/docs/_images/putty-06.png new file mode 100644 index 0000000..55969a6 Binary files /dev/null and b/docs/_images/putty-06.png differ diff --git a/docs/_images/putty-07.png b/docs/_images/putty-07.png new file mode 100644 index 0000000..9bb8398 Binary files /dev/null and b/docs/_images/putty-07.png differ diff --git a/docs/_images/putty-08.png b/docs/_images/putty-08.png new file mode 100644 index 0000000..6273035 Binary files /dev/null and b/docs/_images/putty-08.png differ diff --git a/docs/_images/putty-09.png b/docs/_images/putty-09.png new file mode 100644 index 0000000..71bc3ef Binary files /dev/null and b/docs/_images/putty-09.png differ diff --git a/docs/_images/putty-10.png b/docs/_images/putty-10.png new file mode 100644 index 0000000..8186f4d Binary files /dev/null and b/docs/_images/putty-10.png differ diff --git a/docs/_images/putty-11.png b/docs/_images/putty-11.png new file mode 100644 index 0000000..a7cf0d9 Binary files /dev/null and b/docs/_images/putty-11.png differ diff --git a/docs/_images/putty-12.png b/docs/_images/putty-12.png new file mode 100644 index 0000000..2bbdbe2 Binary files /dev/null and b/docs/_images/putty-12.png differ diff --git a/docs/_images/putty-13.png b/docs/_images/putty-13.png new file mode 100644 index 0000000..b0089d9 Binary files /dev/null and b/docs/_images/putty-13.png differ diff --git a/docs/_images/putty-14.png b/docs/_images/putty-14.png new file mode 100644 index 0000000..f8cc63c Binary files /dev/null and b/docs/_images/putty-14.png differ diff --git a/docs/_images/putty-15.png b/docs/_images/putty-15.png new file mode 100644 index 0000000..ecd07d7 Binary files /dev/null and b/docs/_images/putty-15.png differ diff --git a/docs/_images/putty-16.png b/docs/_images/putty-16.png new file mode 100644 index 0000000..2579abd Binary files /dev/null and b/docs/_images/putty-16.png differ diff --git a/docs/_images/rc_file_content.png b/docs/_images/rc_file_content.png new file mode 100644 index 0000000..463a42a Binary files /dev/null and b/docs/_images/rc_file_content.png differ diff --git a/docs/_images/redis-data.png b/docs/_images/redis-data.png new file mode 100644 index 0000000..c993c8b Binary files /dev/null and b/docs/_images/redis-data.png differ diff --git a/docs/_images/redis_kill.png b/docs/_images/redis_kill.png new file mode 100644 index 0000000..56f826c Binary files /dev/null and b/docs/_images/redis_kill.png differ diff --git a/docs/_images/register_cloudferrocloud.png b/docs/_images/register_cloudferrocloud.png new file mode 100644 index 0000000..9c1f815 Binary files /dev/null and b/docs/_images/register_cloudferrocloud.png differ diff --git a/docs/_images/register_cloudferrocloud1.png b/docs/_images/register_cloudferrocloud1.png new file mode 100644 index 0000000..9c1f815 Binary files /dev/null and b/docs/_images/register_cloudferrocloud1.png differ diff --git a/docs/_images/register_cloudferrocloud1.png.md b/docs/_images/register_cloudferrocloud1.png.md new file mode 100644 index 0000000..4af1832 --- /dev/null +++ b/docs/_images/register_cloudferrocloud1.png.md @@ -0,0 +1 @@ +None \ No newline at end of file diff --git a/docs/_images/register_organization_cloudferrocloud.png b/docs/_images/register_organization_cloudferrocloud.png new file mode 100644 index 0000000..a902746 Binary files /dev/null and b/docs/_images/register_organization_cloudferrocloud.png differ diff --git a/docs/_images/registration_successful_cloudferrocloud.png b/docs/_images/registration_successful_cloudferrocloud.png new file mode 100644 index 0000000..8226029 Binary files /dev/null and b/docs/_images/registration_successful_cloudferrocloud.png differ diff --git a/docs/_images/removed_ec2_empty.png b/docs/_images/removed_ec2_empty.png new file mode 100644 index 0000000..ef71535 Binary files /dev/null and b/docs/_images/removed_ec2_empty.png differ diff --git a/docs/_images/request_for_nodegroup.png b/docs/_images/request_for_nodegroup.png new file mode 100644 index 0000000..fd97e77 Binary files /dev/null and b/docs/_images/request_for_nodegroup.png differ diff --git a/docs/_images/resize-vm-horizon-1.png b/docs/_images/resize-vm-horizon-1.png new file mode 100644 index 0000000..2248e84 Binary files /dev/null and b/docs/_images/resize-vm-horizon-1.png differ diff --git a/docs/_images/resize-vm-horizon-10.png b/docs/_images/resize-vm-horizon-10.png new file mode 100644 index 0000000..98e6d86 Binary files /dev/null and b/docs/_images/resize-vm-horizon-10.png differ diff --git a/docs/_images/resize-vm-horizon-11.png b/docs/_images/resize-vm-horizon-11.png new file mode 100644 index 0000000..af93eb6 Binary files /dev/null and b/docs/_images/resize-vm-horizon-11.png differ diff --git a/docs/_images/resize-vm-horizon-2.png b/docs/_images/resize-vm-horizon-2.png new file mode 100644 index 0000000..ed9525d Binary files /dev/null and b/docs/_images/resize-vm-horizon-2.png differ diff --git a/docs/_images/resize-vm-horizon-3.png b/docs/_images/resize-vm-horizon-3.png new file mode 100644 index 0000000..0cd93a8 Binary files /dev/null and b/docs/_images/resize-vm-horizon-3.png differ diff --git a/docs/_images/resize-vm-horizon-4.png b/docs/_images/resize-vm-horizon-4.png new file mode 100644 index 0000000..8386b1e Binary files /dev/null and b/docs/_images/resize-vm-horizon-4.png differ diff --git a/docs/_images/resize-vm-horizon-5.png b/docs/_images/resize-vm-horizon-5.png new file mode 100644 index 0000000..f50afd2 Binary files /dev/null and b/docs/_images/resize-vm-horizon-5.png differ diff --git a/docs/_images/resize-vm-horizon-7.png b/docs/_images/resize-vm-horizon-7.png new file mode 100644 index 0000000..2ed428b Binary files /dev/null and b/docs/_images/resize-vm-horizon-7.png differ diff --git a/docs/_images/resize-vm-horizon-8.png b/docs/_images/resize-vm-horizon-8.png new file mode 100644 index 0000000..2584334 Binary files /dev/null and b/docs/_images/resize-vm-horizon-8.png differ diff --git a/docs/_images/resize-vm-horizon-cli-2.png b/docs/_images/resize-vm-horizon-cli-2.png new file mode 100644 index 0000000..e1880e3 Binary files /dev/null and b/docs/_images/resize-vm-horizon-cli-2.png differ diff --git a/docs/_images/resize-vm-horizon-cli-3.png b/docs/_images/resize-vm-horizon-cli-3.png new file mode 100644 index 0000000..14e07f1 Binary files /dev/null and b/docs/_images/resize-vm-horizon-cli-3.png differ diff --git a/docs/_images/resize-vm-horizon-cli-4.png b/docs/_images/resize-vm-horizon-cli-4.png new file mode 100644 index 0000000..aa48517 Binary files /dev/null and b/docs/_images/resize-vm-horizon-cli-4.png differ diff --git a/docs/_images/resize_instance.png b/docs/_images/resize_instance.png new file mode 100644 index 0000000..35ecbf0 Binary files /dev/null and b/docs/_images/resize_instance.png differ diff --git a/docs/_images/result_of_creating_nodegroup.png b/docs/_images/result_of_creating_nodegroup.png new file mode 100644 index 0000000..24479a2 Binary files /dev/null and b/docs/_images/result_of_creating_nodegroup.png differ diff --git a/docs/_images/role_test.png b/docs/_images/role_test.png new file mode 100644 index 0000000..cf139d4 Binary files /dev/null and b/docs/_images/role_test.png differ diff --git a/docs/_images/run-mmc.png b/docs/_images/run-mmc.png new file mode 100644 index 0000000..cffcaf7 Binary files /dev/null and b/docs/_images/run-mmc.png differ diff --git a/docs/_images/s3-bucket-versioning-01_creodias.png b/docs/_images/s3-bucket-versioning-01_creodias.png new file mode 100644 index 0000000..4e7581a Binary files /dev/null and b/docs/_images/s3-bucket-versioning-01_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-02_creodias.png b/docs/_images/s3-bucket-versioning-02_creodias.png new file mode 100644 index 0000000..5305489 Binary files /dev/null and b/docs/_images/s3-bucket-versioning-02_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-03_creodias.png b/docs/_images/s3-bucket-versioning-03_creodias.png new file mode 100644 index 0000000..7cbb78a Binary files /dev/null and b/docs/_images/s3-bucket-versioning-03_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-04_creodias.png b/docs/_images/s3-bucket-versioning-04_creodias.png new file mode 100644 index 0000000..672a054 Binary files /dev/null and b/docs/_images/s3-bucket-versioning-04_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-05_creodias.png b/docs/_images/s3-bucket-versioning-05_creodias.png new file mode 100644 index 0000000..37bc0bd Binary files /dev/null and b/docs/_images/s3-bucket-versioning-05_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-06_creodias.png b/docs/_images/s3-bucket-versioning-06_creodias.png new file mode 100644 index 0000000..b1b9ef7 Binary files /dev/null and b/docs/_images/s3-bucket-versioning-06_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-07_creodias.png b/docs/_images/s3-bucket-versioning-07_creodias.png new file mode 100644 index 0000000..5daf979 Binary files /dev/null and b/docs/_images/s3-bucket-versioning-07_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-08_creodias.png b/docs/_images/s3-bucket-versioning-08_creodias.png new file mode 100644 index 0000000..dfce4a0 Binary files /dev/null and b/docs/_images/s3-bucket-versioning-08_creodias.png differ diff --git a/docs/_images/s3-bucket-versioning-09_creodias.png b/docs/_images/s3-bucket-versioning-09_creodias.png new file mode 100644 index 0000000..fd7671c Binary files /dev/null and b/docs/_images/s3-bucket-versioning-09_creodias.png differ diff --git a/docs/_images/saml_cloudferro_cloud.png b/docs/_images/saml_cloudferro_cloud.png new file mode 100644 index 0000000..1e48125 Binary files /dev/null and b/docs/_images/saml_cloudferro_cloud.png differ diff --git a/docs/_images/screen03.png b/docs/_images/screen03.png new file mode 100644 index 0000000..10c6310 Binary files /dev/null and b/docs/_images/screen03.png differ diff --git a/docs/_images/screen03a.png b/docs/_images/screen03a.png new file mode 100644 index 0000000..0e4ab5b Binary files /dev/null and b/docs/_images/screen03a.png differ diff --git a/docs/_images/screen07.png b/docs/_images/screen07.png new file mode 100644 index 0000000..9720655 Binary files /dev/null and b/docs/_images/screen07.png differ diff --git a/docs/_images/screen1.png b/docs/_images/screen1.png new file mode 100644 index 0000000..1ee046d Binary files /dev/null and b/docs/_images/screen1.png differ diff --git a/docs/_images/screen11.png b/docs/_images/screen11.png new file mode 100644 index 0000000..7508435 Binary files /dev/null and b/docs/_images/screen11.png differ diff --git a/docs/_images/screen12.png b/docs/_images/screen12.png new file mode 100644 index 0000000..1bb22f4 Binary files /dev/null and b/docs/_images/screen12.png differ diff --git a/docs/_images/screen13.png b/docs/_images/screen13.png new file mode 100644 index 0000000..a8d0672 Binary files /dev/null and b/docs/_images/screen13.png differ diff --git a/docs/_images/screen14.png b/docs/_images/screen14.png new file mode 100644 index 0000000..4965cca Binary files /dev/null and b/docs/_images/screen14.png differ diff --git a/docs/_images/screen15.png b/docs/_images/screen15.png new file mode 100644 index 0000000..5895d05 Binary files /dev/null and b/docs/_images/screen15.png differ diff --git a/docs/_images/screen16.png b/docs/_images/screen16.png new file mode 100644 index 0000000..fc56e34 Binary files /dev/null and b/docs/_images/screen16.png differ diff --git a/docs/_images/screen17b.png b/docs/_images/screen17b.png new file mode 100644 index 0000000..7961f77 Binary files /dev/null and b/docs/_images/screen17b.png differ diff --git a/docs/_images/screen18.png b/docs/_images/screen18.png new file mode 100644 index 0000000..b56b79f Binary files /dev/null and b/docs/_images/screen18.png differ diff --git a/docs/_images/screen19.png b/docs/_images/screen19.png new file mode 100644 index 0000000..e1f0d4e Binary files /dev/null and b/docs/_images/screen19.png differ diff --git a/docs/_images/screen2.png b/docs/_images/screen2.png new file mode 100644 index 0000000..48f9ca8 Binary files /dev/null and b/docs/_images/screen2.png differ diff --git a/docs/_images/screen20.png b/docs/_images/screen20.png new file mode 100644 index 0000000..95b4355 Binary files /dev/null and b/docs/_images/screen20.png differ diff --git a/docs/_images/screen21.png b/docs/_images/screen21.png new file mode 100644 index 0000000..d4e4646 Binary files /dev/null and b/docs/_images/screen21.png differ diff --git a/docs/_images/screen22.png b/docs/_images/screen22.png new file mode 100644 index 0000000..191778a Binary files /dev/null and b/docs/_images/screen22.png differ diff --git a/docs/_images/screen23.png b/docs/_images/screen23.png new file mode 100644 index 0000000..1dab999 Binary files /dev/null and b/docs/_images/screen23.png differ diff --git a/docs/_images/screen23a.png b/docs/_images/screen23a.png new file mode 100644 index 0000000..3cc198c Binary files /dev/null and b/docs/_images/screen23a.png differ diff --git a/docs/_images/screen24a.png b/docs/_images/screen24a.png new file mode 100644 index 0000000..d2cb81f Binary files /dev/null and b/docs/_images/screen24a.png differ diff --git a/docs/_images/screen25a.png b/docs/_images/screen25a.png new file mode 100644 index 0000000..764d973 Binary files /dev/null and b/docs/_images/screen25a.png differ diff --git a/docs/_images/screen26a.png b/docs/_images/screen26a.png new file mode 100644 index 0000000..883a4ac Binary files /dev/null and b/docs/_images/screen26a.png differ diff --git a/docs/_images/screen27a.png b/docs/_images/screen27a.png new file mode 100644 index 0000000..bfc3b25 Binary files /dev/null and b/docs/_images/screen27a.png differ diff --git a/docs/_images/screen28a.png b/docs/_images/screen28a.png new file mode 100644 index 0000000..fd4d32e Binary files /dev/null and b/docs/_images/screen28a.png differ diff --git a/docs/_images/screen29b.png b/docs/_images/screen29b.png new file mode 100644 index 0000000..997caea Binary files /dev/null and b/docs/_images/screen29b.png differ diff --git a/docs/_images/screen3.png b/docs/_images/screen3.png new file mode 100644 index 0000000..392159f Binary files /dev/null and b/docs/_images/screen3.png differ diff --git a/docs/_images/screen30b.png b/docs/_images/screen30b.png new file mode 100644 index 0000000..d202452 Binary files /dev/null and b/docs/_images/screen30b.png differ diff --git a/docs/_images/screen31a.png b/docs/_images/screen31a.png new file mode 100644 index 0000000..0a59f5e Binary files /dev/null and b/docs/_images/screen31a.png differ diff --git a/docs/_images/screen32a.png b/docs/_images/screen32a.png new file mode 100644 index 0000000..1614b1b Binary files /dev/null and b/docs/_images/screen32a.png differ diff --git a/docs/_images/screen33a.png b/docs/_images/screen33a.png new file mode 100644 index 0000000..dec6b2d Binary files /dev/null and b/docs/_images/screen33a.png differ diff --git a/docs/_images/screen34a.png b/docs/_images/screen34a.png new file mode 100644 index 0000000..3c08033 Binary files /dev/null and b/docs/_images/screen34a.png differ diff --git a/docs/_images/screen35a.png b/docs/_images/screen35a.png new file mode 100644 index 0000000..a43eed9 Binary files /dev/null and b/docs/_images/screen35a.png differ diff --git a/docs/_images/screen36.png b/docs/_images/screen36.png new file mode 100644 index 0000000..ca8fb87 Binary files /dev/null and b/docs/_images/screen36.png differ diff --git a/docs/_images/screen4.png b/docs/_images/screen4.png new file mode 100644 index 0000000..a691dee Binary files /dev/null and b/docs/_images/screen4.png differ diff --git a/docs/_images/screen5.png b/docs/_images/screen5.png new file mode 100644 index 0000000..67bfc4c Binary files /dev/null and b/docs/_images/screen5.png differ diff --git a/docs/_images/screen6.png b/docs/_images/screen6.png new file mode 100644 index 0000000..460bb26 Binary files /dev/null and b/docs/_images/screen6.png differ diff --git a/docs/_images/screen7.png b/docs/_images/screen7.png new file mode 100644 index 0000000..8d6a388 Binary files /dev/null and b/docs/_images/screen7.png differ diff --git a/docs/_images/screen8.png b/docs/_images/screen8.png new file mode 100644 index 0000000..514fed1 Binary files /dev/null and b/docs/_images/screen8.png differ diff --git a/docs/_images/screen9.png b/docs/_images/screen9.png new file mode 100644 index 0000000..a0d1393 Binary files /dev/null and b/docs/_images/screen9.png differ diff --git a/docs/_images/scrn10.png b/docs/_images/scrn10.png new file mode 100644 index 0000000..77b4dfa Binary files /dev/null and b/docs/_images/scrn10.png differ diff --git a/docs/_images/scrn28.png b/docs/_images/scrn28.png new file mode 100644 index 0000000..1550ec0 Binary files /dev/null and b/docs/_images/scrn28.png differ diff --git a/docs/_images/scrn30.png b/docs/_images/scrn30.png new file mode 100644 index 0000000..0c2ace1 Binary files /dev/null and b/docs/_images/scrn30.png differ diff --git a/docs/_images/search_repo.png b/docs/_images/search_repo.png new file mode 100644 index 0000000..a8a84d0 Binary files /dev/null and b/docs/_images/search_repo.png differ diff --git a/docs/_images/select_ci_cd_option.png b/docs/_images/select_ci_cd_option.png new file mode 100644 index 0000000..1b39513 Binary files /dev/null and b/docs/_images/select_ci_cd_option.png differ diff --git a/docs/_images/select_role.png b/docs/_images/select_role.png new file mode 100644 index 0000000..edb1fb2 Binary files /dev/null and b/docs/_images/select_role.png differ diff --git a/docs/_images/select_template_yaml.png b/docs/_images/select_template_yaml.png new file mode 100644 index 0000000..82a631e Binary files /dev/null and b/docs/_images/select_template_yaml.png differ diff --git a/docs/_images/services_cloudferrocloud.png b/docs/_images/services_cloudferrocloud.png new file mode 100644 index 0000000..5db0891 Binary files /dev/null and b/docs/_images/services_cloudferrocloud.png differ diff --git a/docs/_images/several_ec2_pairs.png b/docs/_images/several_ec2_pairs.png new file mode 100644 index 0000000..e37abf2 Binary files /dev/null and b/docs/_images/several_ec2_pairs.png differ diff --git a/docs/_images/show_example_domain_record_sets.png b/docs/_images/show_example_domain_record_sets.png new file mode 100644 index 0000000..bf71045 Binary files /dev/null and b/docs/_images/show_example_domain_record_sets.png differ diff --git a/docs/_images/shut_off_instance.png b/docs/_images/shut_off_instance.png new file mode 100644 index 0000000..d413646 Binary files /dev/null and b/docs/_images/shut_off_instance.png differ diff --git a/docs/_images/size_screen_filled.png b/docs/_images/size_screen_filled.png new file mode 100644 index 0000000..7d96da5 Binary files /dev/null and b/docs/_images/size_screen_filled.png differ diff --git a/docs/_images/snap-in.png b/docs/_images/snap-in.png new file mode 100644 index 0000000..792c34b Binary files /dev/null and b/docs/_images/snap-in.png differ diff --git a/docs/_images/snap00.png b/docs/_images/snap00.png new file mode 100644 index 0000000..a61326f Binary files /dev/null and b/docs/_images/snap00.png differ diff --git a/docs/_images/snap01.png b/docs/_images/snap01.png new file mode 100644 index 0000000..711d837 Binary files /dev/null and b/docs/_images/snap01.png differ diff --git a/docs/_images/snap1.png b/docs/_images/snap1.png new file mode 100644 index 0000000..93bb720 Binary files /dev/null and b/docs/_images/snap1.png differ diff --git a/docs/_images/snap2.png b/docs/_images/snap2.png new file mode 100644 index 0000000..1d807d3 Binary files /dev/null and b/docs/_images/snap2.png differ diff --git a/docs/_images/snap3.png b/docs/_images/snap3.png new file mode 100644 index 0000000..05e5685 Binary files /dev/null and b/docs/_images/snap3.png differ diff --git a/docs/_images/snap4.png b/docs/_images/snap4.png new file mode 100644 index 0000000..06a0446 Binary files /dev/null and b/docs/_images/snap4.png differ diff --git a/docs/_images/snap5.png b/docs/_images/snap5.png new file mode 100644 index 0000000..c7ec975 Binary files /dev/null and b/docs/_images/snap5.png differ diff --git a/docs/_images/snap6.png b/docs/_images/snap6.png new file mode 100644 index 0000000..349f6fa Binary files /dev/null and b/docs/_images/snap6.png differ diff --git a/docs/_images/snap7.png b/docs/_images/snap7.png new file mode 100644 index 0000000..30c0c8d Binary files /dev/null and b/docs/_images/snap7.png differ diff --git a/docs/_images/snap8.png b/docs/_images/snap8.png new file mode 100644 index 0000000..f5e3311 Binary files /dev/null and b/docs/_images/snap8.png differ diff --git a/docs/_images/some_nodes.png b/docs/_images/some_nodes.png new file mode 100644 index 0000000..ff1fd3f Binary files /dev/null and b/docs/_images/some_nodes.png differ diff --git a/docs/_images/spot_flavors_when_creating.png b/docs/_images/spot_flavors_when_creating.png new file mode 100644 index 0000000..477e204 Binary files /dev/null and b/docs/_images/spot_flavors_when_creating.png differ diff --git a/docs/_images/spot_hma_created.png b/docs/_images/spot_hma_created.png new file mode 100644 index 0000000..506b300 Binary files /dev/null and b/docs/_images/spot_hma_created.png differ diff --git a/docs/_images/ssh-import-01_creodias.png b/docs/_images/ssh-import-01_creodias.png new file mode 100644 index 0000000..14c9b10 Binary files /dev/null and b/docs/_images/ssh-import-01_creodias.png differ diff --git a/docs/_images/ssh-import-02_creodias.png b/docs/_images/ssh-import-02_creodias.png new file mode 100644 index 0000000..d296c2f Binary files /dev/null and b/docs/_images/ssh-import-02_creodias.png differ diff --git a/docs/_images/ssh-import-03_creodias.png b/docs/_images/ssh-import-03_creodias.png new file mode 100644 index 0000000..deb5261 Binary files /dev/null and b/docs/_images/ssh-import-03_creodias.png differ diff --git a/docs/_images/ssh-import-04_creodias.png b/docs/_images/ssh-import-04_creodias.png new file mode 100644 index 0000000..f481563 Binary files /dev/null and b/docs/_images/ssh-import-04_creodias.png differ diff --git a/docs/_images/ssh1.png b/docs/_images/ssh1.png new file mode 100644 index 0000000..c6ec3ae Binary files /dev/null and b/docs/_images/ssh1.png differ diff --git a/docs/_images/ssh2.png b/docs/_images/ssh2.png new file mode 100644 index 0000000..50a25aa Binary files /dev/null and b/docs/_images/ssh2.png differ diff --git a/docs/_images/ssh3.png b/docs/_images/ssh3.png new file mode 100644 index 0000000..78a3092 Binary files /dev/null and b/docs/_images/ssh3.png differ diff --git a/docs/_images/ssh_linux1.png b/docs/_images/ssh_linux1.png new file mode 100644 index 0000000..a1726dd Binary files /dev/null and b/docs/_images/ssh_linux1.png differ diff --git a/docs/_images/ssh_linux2.png b/docs/_images/ssh_linux2.png new file mode 100644 index 0000000..5343275 Binary files /dev/null and b/docs/_images/ssh_linux2.png differ diff --git a/docs/_images/ssh_windows_1.png b/docs/_images/ssh_windows_1.png new file mode 100644 index 0000000..b2fa4ef Binary files /dev/null and b/docs/_images/ssh_windows_1.png differ diff --git a/docs/_images/ssh_windows_2.png b/docs/_images/ssh_windows_2.png new file mode 100644 index 0000000..f09cbb9 Binary files /dev/null and b/docs/_images/ssh_windows_2.png differ diff --git a/docs/_images/ssh_windows_3.png b/docs/_images/ssh_windows_3.png new file mode 100644 index 0000000..e57b1bd Binary files /dev/null and b/docs/_images/ssh_windows_3.png differ diff --git a/docs/_images/ssh_windows_4.png b/docs/_images/ssh_windows_4.png new file mode 100644 index 0000000..a0dd222 Binary files /dev/null and b/docs/_images/ssh_windows_4.png differ diff --git a/docs/_images/ssh_windows_5.png b/docs/_images/ssh_windows_5.png new file mode 100644 index 0000000..3aaafdb Binary files /dev/null and b/docs/_images/ssh_windows_5.png differ diff --git a/docs/_images/ssh_windows_6.png b/docs/_images/ssh_windows_6.png new file mode 100644 index 0000000..03464d1 Binary files /dev/null and b/docs/_images/ssh_windows_6.png differ diff --git a/docs/_images/stacks_creations.png b/docs/_images/stacks_creations.png new file mode 100644 index 0000000..e0b7e32 Binary files /dev/null and b/docs/_images/stacks_creations.png differ diff --git a/docs/_images/stacks_menu.png b/docs/_images/stacks_menu.png new file mode 100644 index 0000000..a06fc32 Binary files /dev/null and b/docs/_images/stacks_menu.png differ diff --git a/docs/_images/start_using_vault.png b/docs/_images/start_using_vault.png new file mode 100644 index 0000000..00f7fb0 Binary files /dev/null and b/docs/_images/start_using_vault.png differ diff --git a/docs/_images/start_vm_instance_snapshot_cli-01_creodias.png b/docs/_images/start_vm_instance_snapshot_cli-01_creodias.png new file mode 100644 index 0000000..c1ecf4c Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_cli-01_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_cli-02_creodias.png b/docs/_images/start_vm_instance_snapshot_cli-02_creodias.png new file mode 100644 index 0000000..eda43c4 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_cli-02_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_cli-03_creodias.png b/docs/_images/start_vm_instance_snapshot_cli-03_creodias.png new file mode 100644 index 0000000..5fae858 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_cli-03_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_cli-04_creodias.png b/docs/_images/start_vm_instance_snapshot_cli-04_creodias.png new file mode 100644 index 0000000..3a027ca Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_cli-04_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_cli-05_creodias.png b/docs/_images/start_vm_instance_snapshot_cli-05_creodias.png new file mode 100644 index 0000000..d722bfc Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_cli-05_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-01_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-01_creodias.png new file mode 100644 index 0000000..3968ab1 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-01_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-02_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-02_creodias.png new file mode 100644 index 0000000..733fb9a Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-02_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-03_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-03_creodias.png new file mode 100644 index 0000000..e56d43b Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-03_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-04_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-04_creodias.png new file mode 100644 index 0000000..c6fc165 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-04_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-05_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-05_creodias.png new file mode 100644 index 0000000..1558b43 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-05_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-06_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-06_creodias.png new file mode 100644 index 0000000..17a2e08 Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-06_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-07_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-07_creodias.png new file mode 100644 index 0000000..eb58bad Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-07_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-08_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-08_creodias.png new file mode 100644 index 0000000..775b6ec Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-08_creodias.png differ diff --git a/docs/_images/start_vm_instance_snapshot_horizon-09_creodias.png b/docs/_images/start_vm_instance_snapshot_horizon-09_creodias.png new file mode 100644 index 0000000..17f193d Binary files /dev/null and b/docs/_images/start_vm_instance_snapshot_horizon-09_creodias.png differ diff --git a/docs/_images/starting_to_server.png b/docs/_images/starting_to_server.png new file mode 100644 index 0000000..fe77104 Binary files /dev/null and b/docs/_images/starting_to_server.png differ diff --git a/docs/_images/state_again.png b/docs/_images/state_again.png new file mode 100644 index 0000000..b10f1e9 Binary files /dev/null and b/docs/_images/state_again.png differ diff --git a/docs/_images/statuspower.png b/docs/_images/statuspower.png new file mode 100644 index 0000000..fbc676a Binary files /dev/null and b/docs/_images/statuspower.png differ diff --git a/docs/_images/step-create-an-image.png b/docs/_images/step-create-an-image.png new file mode 100644 index 0000000..82d996e Binary files /dev/null and b/docs/_images/step-create-an-image.png differ diff --git a/docs/_images/successful_installation_of_gitlab.png b/docs/_images/successful_installation_of_gitlab.png new file mode 100644 index 0000000..deaa5f6 Binary files /dev/null and b/docs/_images/successful_installation_of_gitlab.png differ diff --git a/docs/_images/sudo_su_eouser.png b/docs/_images/sudo_su_eouser.png new file mode 100644 index 0000000..358254f Binary files /dev/null and b/docs/_images/sudo_su_eouser.png differ diff --git a/docs/_images/swapped_address.png b/docs/_images/swapped_address.png new file mode 100644 index 0000000..d1c26b7 Binary files /dev/null and b/docs/_images/swapped_address.png differ diff --git a/docs/_images/table_testing.png b/docs/_images/table_testing.png new file mode 100644 index 0000000..5fac4cb Binary files /dev/null and b/docs/_images/table_testing.png differ diff --git a/docs/_images/template_generator.png b/docs/_images/template_generator.png new file mode 100644 index 0000000..6557ace Binary files /dev/null and b/docs/_images/template_generator.png differ diff --git a/docs/_images/template_show_non_gpu.png b/docs/_images/template_show_non_gpu.png new file mode 100644 index 0000000..3e1dffe Binary files /dev/null and b/docs/_images/template_show_non_gpu.png differ diff --git a/docs/_images/terraform_adding_repository.png b/docs/_images/terraform_adding_repository.png new file mode 100644 index 0000000..2f18fbd Binary files /dev/null and b/docs/_images/terraform_adding_repository.png differ diff --git a/docs/_images/terraform_apply.png b/docs/_images/terraform_apply.png new file mode 100644 index 0000000..5a46fde Binary files /dev/null and b/docs/_images/terraform_apply.png differ diff --git a/docs/_images/terraform_flavor_list_short.png b/docs/_images/terraform_flavor_list_short.png new file mode 100644 index 0000000..87f7146 Binary files /dev/null and b/docs/_images/terraform_flavor_list_short.png differ diff --git a/docs/_images/terraform_horizon.png b/docs/_images/terraform_horizon.png new file mode 100644 index 0000000..b14ee32 Binary files /dev/null and b/docs/_images/terraform_horizon.png differ diff --git a/docs/_images/terraform_init.png b/docs/_images/terraform_init.png new file mode 100644 index 0000000..e7d2095 Binary files /dev/null and b/docs/_images/terraform_init.png differ diff --git a/docs/_images/terraform_yes.png b/docs/_images/terraform_yes.png new file mode 100644 index 0000000..7d7e2cb Binary files /dev/null and b/docs/_images/terraform_yes.png differ diff --git a/docs/_images/testproject.png b/docs/_images/testproject.png new file mode 100644 index 0000000..ec99d1d Binary files /dev/null and b/docs/_images/testproject.png differ diff --git a/docs/_images/three_backups_mybackup.png b/docs/_images/three_backups_mybackup.png new file mode 100644 index 0000000..55580fc Binary files /dev/null and b/docs/_images/three_backups_mybackup.png differ diff --git a/docs/_images/tickets_cloudferrocloud.png b/docs/_images/tickets_cloudferrocloud.png new file mode 100644 index 0000000..bb69592 Binary files /dev/null and b/docs/_images/tickets_cloudferrocloud.png differ diff --git a/docs/_images/trag_8080.png b/docs/_images/trag_8080.png new file mode 100644 index 0000000..5f93cf5 Binary files /dev/null and b/docs/_images/trag_8080.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-14_creodias.png b/docs/_images/transfer-volume-between-projects-cli-14_creodias.png new file mode 100644 index 0000000..c8b3e97 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-14_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-25_creodias.png b/docs/_images/transfer-volume-between-projects-cli-25_creodias.png new file mode 100644 index 0000000..f4bd0fa Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-25_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-26_creodias.png b/docs/_images/transfer-volume-between-projects-cli-26_creodias.png new file mode 100644 index 0000000..9018dce Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-26_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-27_creodias.png b/docs/_images/transfer-volume-between-projects-cli-27_creodias.png new file mode 100644 index 0000000..21babce Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-27_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-32_creodias.png b/docs/_images/transfer-volume-between-projects-cli-32_creodias.png new file mode 100644 index 0000000..486ba8c Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-32_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-33_creodias.png b/docs/_images/transfer-volume-between-projects-cli-33_creodias.png new file mode 100644 index 0000000..1f9b5d7 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-33_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-cli-34_creodias.png b/docs/_images/transfer-volume-between-projects-cli-34_creodias.png new file mode 100644 index 0000000..65b1ec5 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-cli-34_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-11_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-11_creodias.png new file mode 100644 index 0000000..274382d Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-11_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-15_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-15_creodias.png new file mode 100644 index 0000000..17e44fd Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-15_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-16_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-16_creodias.png new file mode 100644 index 0000000..541d27d Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-16_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-17_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-17_creodias.png new file mode 100644 index 0000000..b421263 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-17_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-18_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-18_creodias.png new file mode 100644 index 0000000..cb7ff31 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-18_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-19_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-19_creodias.png new file mode 100644 index 0000000..762cdac Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-19_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-20_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-20_creodias.png new file mode 100644 index 0000000..251e58c Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-20_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-21_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-21_creodias.png new file mode 100644 index 0000000..f0be344 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-21_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-32_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-32_creodias.png new file mode 100644 index 0000000..9ea84c8 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-32_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-33_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-33_creodias.png new file mode 100644 index 0000000..67da5cc Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-33_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-35_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-35_creodias.png new file mode 100644 index 0000000..c0e8be8 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-35_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-36_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-36_creodias.png new file mode 100644 index 0000000..4754b6d Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-36_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-37_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-37_creodias.png new file mode 100644 index 0000000..118546c Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-37_creodias.png differ diff --git a/docs/_images/transfer-volume-between-projects-horizon-38_creodias.png b/docs/_images/transfer-volume-between-projects-horizon-38_creodias.png new file mode 100644 index 0000000..3dfcd45 Binary files /dev/null and b/docs/_images/transfer-volume-between-projects-horizon-38_creodias.png differ diff --git a/docs/_images/unable_to_create_a_cluster.png b/docs/_images/unable_to_create_a_cluster.png new file mode 100644 index 0000000..0ba9ed5 Binary files /dev/null and b/docs/_images/unable_to_create_a_cluster.png differ diff --git a/docs/_images/unavailable_network.png b/docs/_images/unavailable_network.png new file mode 100644 index 0000000..1b037c9 Binary files /dev/null and b/docs/_images/unavailable_network.png differ diff --git a/docs/_images/unsealing_the_pod.png b/docs/_images/unsealing_the_pod.png new file mode 100644 index 0000000..b8654de Binary files /dev/null and b/docs/_images/unsealing_the_pod.png differ diff --git a/docs/_images/upgrade-kubernetes-1.png b/docs/_images/upgrade-kubernetes-1.png new file mode 100644 index 0000000..b0bcb98 Binary files /dev/null and b/docs/_images/upgrade-kubernetes-1.png differ diff --git a/docs/_images/upgrade-kubernetes-10.png b/docs/_images/upgrade-kubernetes-10.png new file mode 100644 index 0000000..3b272d8 Binary files /dev/null and b/docs/_images/upgrade-kubernetes-10.png differ diff --git a/docs/_images/upgrade-kubernetes-11.png b/docs/_images/upgrade-kubernetes-11.png new file mode 100644 index 0000000..1322fa6 Binary files /dev/null and b/docs/_images/upgrade-kubernetes-11.png differ diff --git a/docs/_images/upgrade-kubernetes-15.png b/docs/_images/upgrade-kubernetes-15.png new file mode 100644 index 0000000..48133fa Binary files /dev/null and b/docs/_images/upgrade-kubernetes-15.png differ diff --git a/docs/_images/upgrade-kubernetes-17.png b/docs/_images/upgrade-kubernetes-17.png new file mode 100644 index 0000000..d657285 Binary files /dev/null and b/docs/_images/upgrade-kubernetes-17.png differ diff --git a/docs/_images/upload-image-cli-01_creodias.png b/docs/_images/upload-image-cli-01_creodias.png new file mode 100644 index 0000000..7429cf7 Binary files /dev/null and b/docs/_images/upload-image-cli-01_creodias.png differ diff --git a/docs/_images/upload-image-cli-02_creodias.png b/docs/_images/upload-image-cli-02_creodias.png new file mode 100644 index 0000000..ac628e6 Binary files /dev/null and b/docs/_images/upload-image-cli-02_creodias.png differ diff --git a/docs/_images/upload-image-cli-03_creodias.png b/docs/_images/upload-image-cli-03_creodias.png new file mode 100644 index 0000000..3a744e9 Binary files /dev/null and b/docs/_images/upload-image-cli-03_creodias.png differ diff --git a/docs/_images/upload-image-cli-10_creodias.png b/docs/_images/upload-image-cli-10_creodias.png new file mode 100644 index 0000000..77f53d7 Binary files /dev/null and b/docs/_images/upload-image-cli-10_creodias.png differ diff --git a/docs/_images/upload-image-cli-11_creodias.png b/docs/_images/upload-image-cli-11_creodias.png new file mode 100644 index 0000000..24770ad Binary files /dev/null and b/docs/_images/upload-image-cli-11_creodias.png differ diff --git a/docs/_images/upload-image-cli-12_creodias.png b/docs/_images/upload-image-cli-12_creodias.png new file mode 100644 index 0000000..174d448 Binary files /dev/null and b/docs/_images/upload-image-cli-12_creodias.png differ diff --git a/docs/_images/upload-image-horizon-01_creodias.png b/docs/_images/upload-image-horizon-01_creodias.png new file mode 100644 index 0000000..5f7b902 Binary files /dev/null and b/docs/_images/upload-image-horizon-01_creodias.png differ diff --git a/docs/_images/upload-image-horizon-02_creodias.png b/docs/_images/upload-image-horizon-02_creodias.png new file mode 100644 index 0000000..fdbda22 Binary files /dev/null and b/docs/_images/upload-image-horizon-02_creodias.png differ diff --git a/docs/_images/upload-image-horizon-03_creodias.png b/docs/_images/upload-image-horizon-03_creodias.png new file mode 100644 index 0000000..ab30afb Binary files /dev/null and b/docs/_images/upload-image-horizon-03_creodias.png differ diff --git a/docs/_images/upload-image-horizon-04_creodias.png b/docs/_images/upload-image-horizon-04_creodias.png new file mode 100644 index 0000000..9d77303 Binary files /dev/null and b/docs/_images/upload-image-horizon-04_creodias.png differ diff --git a/docs/_images/upload-image-horizon-07_creodias.png b/docs/_images/upload-image-horizon-07_creodias.png new file mode 100644 index 0000000..d55fa2a Binary files /dev/null and b/docs/_images/upload-image-horizon-07_creodias.png differ diff --git a/docs/_images/upload-image-horizon-08_creodias.png b/docs/_images/upload-image-horizon-08_creodias.png new file mode 100644 index 0000000..645a0b8 Binary files /dev/null and b/docs/_images/upload-image-horizon-08_creodias.png differ diff --git a/docs/_images/upload-image-horizon-10_creodias.png b/docs/_images/upload-image-horizon-10_creodias.png new file mode 100644 index 0000000..174d448 Binary files /dev/null and b/docs/_images/upload-image-horizon-10_creodias.png differ diff --git a/docs/_images/use-docker-4.png b/docs/_images/use-docker-4.png new file mode 100644 index 0000000..23be291 Binary files /dev/null and b/docs/_images/use-docker-4.png differ diff --git a/docs/_images/use-docker-5.png b/docs/_images/use-docker-5.png new file mode 100644 index 0000000..ff770fc Binary files /dev/null and b/docs/_images/use-docker-5.png differ diff --git a/docs/_images/use-docker-6.png b/docs/_images/use-docker-6.png new file mode 100644 index 0000000..72e1d7f Binary files /dev/null and b/docs/_images/use-docker-6.png differ diff --git a/docs/_images/use-docker-7.png b/docs/_images/use-docker-7.png new file mode 100644 index 0000000..e911205 Binary files /dev/null and b/docs/_images/use-docker-7.png differ diff --git a/docs/_images/use-docker-9.png b/docs/_images/use-docker-9.png new file mode 100644 index 0000000..a71e66c Binary files /dev/null and b/docs/_images/use-docker-9.png differ diff --git a/docs/_images/use-object-storage-01_creodias.png b/docs/_images/use-object-storage-01_creodias.png new file mode 100644 index 0000000..2de1eb1 Binary files /dev/null and b/docs/_images/use-object-storage-01_creodias.png differ diff --git a/docs/_images/use-object-storage-02_creodias.png b/docs/_images/use-object-storage-02_creodias.png new file mode 100644 index 0000000..ecbfd1d Binary files /dev/null and b/docs/_images/use-object-storage-02_creodias.png differ diff --git a/docs/_images/use-object-storage-03_creodias.png b/docs/_images/use-object-storage-03_creodias.png new file mode 100644 index 0000000..be49d5d Binary files /dev/null and b/docs/_images/use-object-storage-03_creodias.png differ diff --git a/docs/_images/use-object-storage-04_creodias.png b/docs/_images/use-object-storage-04_creodias.png new file mode 100644 index 0000000..174e290 Binary files /dev/null and b/docs/_images/use-object-storage-04_creodias.png differ diff --git a/docs/_images/use-object-storage-05_creodias.png b/docs/_images/use-object-storage-05_creodias.png new file mode 100644 index 0000000..5ed131a Binary files /dev/null and b/docs/_images/use-object-storage-05_creodias.png differ diff --git a/docs/_images/use-object-storage-06_creodias.png b/docs/_images/use-object-storage-06_creodias.png new file mode 100644 index 0000000..cf0ce12 Binary files /dev/null and b/docs/_images/use-object-storage-06_creodias.png differ diff --git a/docs/_images/use-object-storage-07_creodias.png b/docs/_images/use-object-storage-07_creodias.png new file mode 100644 index 0000000..880ab2f Binary files /dev/null and b/docs/_images/use-object-storage-07_creodias.png differ diff --git a/docs/_images/use-object-storage-08_creodias.png b/docs/_images/use-object-storage-08_creodias.png new file mode 100644 index 0000000..7751ab5 Binary files /dev/null and b/docs/_images/use-object-storage-08_creodias.png differ diff --git a/docs/_images/use-object-storage-09_creodias.png b/docs/_images/use-object-storage-09_creodias.png new file mode 100644 index 0000000..64f32dd Binary files /dev/null and b/docs/_images/use-object-storage-09_creodias.png differ diff --git a/docs/_images/use-object-storage-10_creodias.png b/docs/_images/use-object-storage-10_creodias.png new file mode 100644 index 0000000..1556e27 Binary files /dev/null and b/docs/_images/use-object-storage-10_creodias.png differ diff --git a/docs/_images/use-object-storage-11_creodias.png b/docs/_images/use-object-storage-11_creodias.png new file mode 100644 index 0000000..0141daf Binary files /dev/null and b/docs/_images/use-object-storage-11_creodias.png differ diff --git a/docs/_images/use-object-storage-13_creodias.png b/docs/_images/use-object-storage-13_creodias.png new file mode 100644 index 0000000..37e406a Binary files /dev/null and b/docs/_images/use-object-storage-13_creodias.png differ diff --git a/docs/_images/use-object-storage-14_creodias.png b/docs/_images/use-object-storage-14_creodias.png new file mode 100644 index 0000000..fd371a1 Binary files /dev/null and b/docs/_images/use-object-storage-14_creodias.png differ diff --git a/docs/_images/use-object-storage-15_creodias.png b/docs/_images/use-object-storage-15_creodias.png new file mode 100644 index 0000000..97e049b Binary files /dev/null and b/docs/_images/use-object-storage-15_creodias.png differ diff --git a/docs/_images/use-object-storage-16_creodias.png b/docs/_images/use-object-storage-16_creodias.png new file mode 100644 index 0000000..e96978c Binary files /dev/null and b/docs/_images/use-object-storage-16_creodias.png differ diff --git a/docs/_images/use-object-storage-17_creodias.png b/docs/_images/use-object-storage-17_creodias.png new file mode 100644 index 0000000..9ab6b2a Binary files /dev/null and b/docs/_images/use-object-storage-17_creodias.png differ diff --git a/docs/_images/use-object-storage-18_creodias.png b/docs/_images/use-object-storage-18_creodias.png new file mode 100644 index 0000000..53dc40b Binary files /dev/null and b/docs/_images/use-object-storage-18_creodias.png differ diff --git a/docs/_images/use-object-storage-19_creodias.png b/docs/_images/use-object-storage-19_creodias.png new file mode 100644 index 0000000..055fd24 Binary files /dev/null and b/docs/_images/use-object-storage-19_creodias.png differ diff --git a/docs/_images/use-object-storage-delete-delete-selected_creodias.png b/docs/_images/use-object-storage-delete-delete-selected_creodias.png new file mode 100644 index 0000000..6d9f44d Binary files /dev/null and b/docs/_images/use-object-storage-delete-delete-selected_creodias.png differ diff --git a/docs/_images/use-object-storage-delete-folder_creodias.png b/docs/_images/use-object-storage-delete-folder_creodias.png new file mode 100644 index 0000000..5ad8e14 Binary files /dev/null and b/docs/_images/use-object-storage-delete-folder_creodias.png differ diff --git a/docs/_images/use-object-storage-new-container_creodias.png b/docs/_images/use-object-storage-new-container_creodias.png new file mode 100644 index 0000000..1593074 Binary files /dev/null and b/docs/_images/use-object-storage-new-container_creodias.png differ diff --git a/docs/_images/use-object-storage-new-folder_creodias.png b/docs/_images/use-object-storage-new-folder_creodias.png new file mode 100644 index 0000000..d2623b6 Binary files /dev/null and b/docs/_images/use-object-storage-new-folder_creodias.png differ diff --git a/docs/_images/use-object-storage-success_creodias.png b/docs/_images/use-object-storage-success_creodias.png new file mode 100644 index 0000000..dcfe31d Binary files /dev/null and b/docs/_images/use-object-storage-success_creodias.png differ diff --git a/docs/_images/use-object-storage-upload_creodias.png b/docs/_images/use-object-storage-upload_creodias.png new file mode 100644 index 0000000..5f97371 Binary files /dev/null and b/docs/_images/use-object-storage-upload_creodias.png differ diff --git a/docs/_images/use-script-rotating-backups-01_creodias.png b/docs/_images/use-script-rotating-backups-01_creodias.png new file mode 100644 index 0000000..67f5240 Binary files /dev/null and b/docs/_images/use-script-rotating-backups-01_creodias.png differ diff --git a/docs/_images/use-script-rotating-backups-02_creodias.png b/docs/_images/use-script-rotating-backups-02_creodias.png new file mode 100644 index 0000000..34d2201 Binary files /dev/null and b/docs/_images/use-script-rotating-backups-02_creodias.png differ diff --git a/docs/_images/use-script-rotating-backups-03_creodias.png b/docs/_images/use-script-rotating-backups-03_creodias.png new file mode 100644 index 0000000..686090a Binary files /dev/null and b/docs/_images/use-script-rotating-backups-03_creodias.png differ diff --git a/docs/_images/use-script-rotating-backups-04_creodias.png b/docs/_images/use-script-rotating-backups-04_creodias.png new file mode 100644 index 0000000..bd0138b Binary files /dev/null and b/docs/_images/use-script-rotating-backups-04_creodias.png differ diff --git a/docs/_images/use-script-rotating-backups-05_creodias.png b/docs/_images/use-script-rotating-backups-05_creodias.png new file mode 100644 index 0000000..5928bf4 Binary files /dev/null and b/docs/_images/use-script-rotating-backups-05_creodias.png differ diff --git a/docs/_images/use-security-groups-1_creodias.png b/docs/_images/use-security-groups-1_creodias.png new file mode 100644 index 0000000..83b2bcf Binary files /dev/null and b/docs/_images/use-security-groups-1_creodias.png differ diff --git a/docs/_images/use-security-groups-2_creodias.png b/docs/_images/use-security-groups-2_creodias.png new file mode 100644 index 0000000..e21a31b Binary files /dev/null and b/docs/_images/use-security-groups-2_creodias.png differ diff --git a/docs/_images/use-security-groups-3_creodias.png b/docs/_images/use-security-groups-3_creodias.png new file mode 100644 index 0000000..53ae139 Binary files /dev/null and b/docs/_images/use-security-groups-3_creodias.png differ diff --git a/docs/_images/use-security-groups-4_creodias.png b/docs/_images/use-security-groups-4_creodias.png new file mode 100644 index 0000000..706d3d9 Binary files /dev/null and b/docs/_images/use-security-groups-4_creodias.png differ diff --git a/docs/_images/use-security-groups-5_creodias.png b/docs/_images/use-security-groups-5_creodias.png new file mode 100644 index 0000000..4fa1db6 Binary files /dev/null and b/docs/_images/use-security-groups-5_creodias.png differ diff --git a/docs/_images/use-security-groups-6_creodias.png b/docs/_images/use-security-groups-6_creodias.png new file mode 100644 index 0000000..6b9f68f Binary files /dev/null and b/docs/_images/use-security-groups-6_creodias.png differ diff --git a/docs/_images/use-security-groups-7_creodias.png b/docs/_images/use-security-groups-7_creodias.png new file mode 100644 index 0000000..2267221 Binary files /dev/null and b/docs/_images/use-security-groups-7_creodias.png differ diff --git a/docs/_images/use_125_version.png b/docs/_images/use_125_version.png new file mode 100644 index 0000000..9fd49a7 Binary files /dev/null and b/docs/_images/use_125_version.png differ diff --git a/docs/_images/use_an_existing_network.png b/docs/_images/use_an_existing_network.png new file mode 100644 index 0000000..dfb1414 Binary files /dev/null and b/docs/_images/use_an_existing_network.png differ diff --git a/docs/_images/user-roles-list-1.png b/docs/_images/user-roles-list-1.png new file mode 100644 index 0000000..997f259 Binary files /dev/null and b/docs/_images/user-roles-list-1.png differ diff --git a/docs/_images/user-roles-list-2.png b/docs/_images/user-roles-list-2.png new file mode 100644 index 0000000..9c95382 Binary files /dev/null and b/docs/_images/user-roles-list-2.png differ diff --git a/docs/_images/user-roles-list-create-1.png b/docs/_images/user-roles-list-create-1.png new file mode 100644 index 0000000..cc7930b Binary files /dev/null and b/docs/_images/user-roles-list-create-1.png differ diff --git a/docs/_images/user-roles-list-create-2.png b/docs/_images/user-roles-list-create-2.png new file mode 100644 index 0000000..e7c07a2 Binary files /dev/null and b/docs/_images/user-roles-list-create-2.png differ diff --git a/docs/_images/user-roles-list-create-3.png b/docs/_images/user-roles-list-create-3.png new file mode 100644 index 0000000..c93d43c Binary files /dev/null and b/docs/_images/user-roles-list-create-3.png differ diff --git a/docs/_images/user-roles-list-create-4.png b/docs/_images/user-roles-list-create-4.png new file mode 100644 index 0000000..07f16d9 Binary files /dev/null and b/docs/_images/user-roles-list-create-4.png differ diff --git a/docs/_images/user-roles-list-create-5.png b/docs/_images/user-roles-list-create-5.png new file mode 100644 index 0000000..313a684 Binary files /dev/null and b/docs/_images/user-roles-list-create-5.png differ diff --git a/docs/_images/user-roles-list-create-6.png b/docs/_images/user-roles-list-create-6.png new file mode 100644 index 0000000..d904438 Binary files /dev/null and b/docs/_images/user-roles-list-create-6.png differ diff --git a/docs/_images/user_credentials.png b/docs/_images/user_credentials.png new file mode 100644 index 0000000..0c799c3 Binary files /dev/null and b/docs/_images/user_credentials.png differ diff --git a/docs/_images/users.png b/docs/_images/users.png new file mode 100644 index 0000000..14ae430 Binary files /dev/null and b/docs/_images/users.png differ diff --git a/docs/_images/users_roles_01_cloudferrocloud.png b/docs/_images/users_roles_01_cloudferrocloud.png new file mode 100644 index 0000000..a18f57e Binary files /dev/null and b/docs/_images/users_roles_01_cloudferrocloud.png differ diff --git a/docs/_images/uses_ephemeral.png b/docs/_images/uses_ephemeral.png new file mode 100644 index 0000000..f437821 Binary files /dev/null and b/docs/_images/uses_ephemeral.png differ diff --git a/docs/_images/value_of_spot.png b/docs/_images/value_of_spot.png new file mode 100644 index 0000000..646d717 Binary files /dev/null and b/docs/_images/value_of_spot.png differ diff --git a/docs/_images/vault_created.png b/docs/_images/vault_created.png new file mode 100644 index 0000000..8e62af7 Binary files /dev/null and b/docs/_images/vault_created.png differ diff --git a/docs/_images/velero_version_working.png b/docs/_images/velero_version_working.png new file mode 100644 index 0000000..7952c5b Binary files /dev/null and b/docs/_images/velero_version_working.png differ diff --git a/docs/_images/vim_editor_change.png b/docs/_images/vim_editor_change.png new file mode 100644 index 0000000..8a2c820 Binary files /dev/null and b/docs/_images/vim_editor_change.png differ diff --git a/docs/_images/vol1.png b/docs/_images/vol1.png new file mode 100644 index 0000000..1c6915c Binary files /dev/null and b/docs/_images/vol1.png differ diff --git a/docs/_images/vol2.png b/docs/_images/vol2.png new file mode 100644 index 0000000..e2c48e1 Binary files /dev/null and b/docs/_images/vol2.png differ diff --git a/docs/_images/vol3.png b/docs/_images/vol3.png new file mode 100644 index 0000000..5f8df2c Binary files /dev/null and b/docs/_images/vol3.png differ diff --git a/docs/_images/vol4.png b/docs/_images/vol4.png new file mode 100644 index 0000000..9ad72b9 Binary files /dev/null and b/docs/_images/vol4.png differ diff --git a/docs/_images/vol5.png b/docs/_images/vol5.png new file mode 100644 index 0000000..f1e717a Binary files /dev/null and b/docs/_images/vol5.png differ diff --git a/docs/_images/vol6.png b/docs/_images/vol6.png new file mode 100644 index 0000000..da65997 Binary files /dev/null and b/docs/_images/vol6.png differ diff --git a/docs/_images/volno1.png b/docs/_images/volno1.png new file mode 100644 index 0000000..bcea58c Binary files /dev/null and b/docs/_images/volno1.png differ diff --git a/docs/_images/volno2.png b/docs/_images/volno2.png new file mode 100644 index 0000000..c3688b5 Binary files /dev/null and b/docs/_images/volno2.png differ diff --git a/docs/_images/volno3.png b/docs/_images/volno3.png new file mode 100644 index 0000000..1c7a2c4 Binary files /dev/null and b/docs/_images/volno3.png differ diff --git a/docs/_images/volno4.png b/docs/_images/volno4.png new file mode 100644 index 0000000..c413573 Binary files /dev/null and b/docs/_images/volno4.png differ diff --git a/docs/_images/volno5.png b/docs/_images/volno5.png new file mode 100644 index 0000000..f197cd9 Binary files /dev/null and b/docs/_images/volno5.png differ diff --git a/docs/_images/volsnap1.png b/docs/_images/volsnap1.png new file mode 100644 index 0000000..644f5e5 Binary files /dev/null and b/docs/_images/volsnap1.png differ diff --git a/docs/_images/volsnap2.png b/docs/_images/volsnap2.png new file mode 100644 index 0000000..db1db53 Binary files /dev/null and b/docs/_images/volsnap2.png differ diff --git a/docs/_images/volsnap3.png b/docs/_images/volsnap3.png new file mode 100644 index 0000000..f034ed2 Binary files /dev/null and b/docs/_images/volsnap3.png differ diff --git a/docs/_images/volsnap4.png b/docs/_images/volsnap4.png new file mode 100644 index 0000000..d193b91 Binary files /dev/null and b/docs/_images/volsnap4.png differ diff --git a/docs/_images/volsnap5.png b/docs/_images/volsnap5.png new file mode 100644 index 0000000..cb95f98 Binary files /dev/null and b/docs/_images/volsnap5.png differ diff --git a/docs/_images/volume-backup-01_creodias.png b/docs/_images/volume-backup-01_creodias.png new file mode 100644 index 0000000..e7c6f95 Binary files /dev/null and b/docs/_images/volume-backup-01_creodias.png differ diff --git a/docs/_images/volume-backup-02_creodias.png b/docs/_images/volume-backup-02_creodias.png new file mode 100644 index 0000000..fea00c3 Binary files /dev/null and b/docs/_images/volume-backup-02_creodias.png differ diff --git a/docs/_images/volume-backup-03_creodias.png b/docs/_images/volume-backup-03_creodias.png new file mode 100644 index 0000000..394d592 Binary files /dev/null and b/docs/_images/volume-backup-03_creodias.png differ diff --git a/docs/_images/volume-backup-04_creodias.png b/docs/_images/volume-backup-04_creodias.png new file mode 100644 index 0000000..e9194fc Binary files /dev/null and b/docs/_images/volume-backup-04_creodias.png differ diff --git a/docs/_images/volume-backup-05_creodias.png b/docs/_images/volume-backup-05_creodias.png new file mode 100644 index 0000000..ae24070 Binary files /dev/null and b/docs/_images/volume-backup-05_creodias.png differ diff --git a/docs/_images/volume-backup-06_creodias.png b/docs/_images/volume-backup-06_creodias.png new file mode 100644 index 0000000..6989185 Binary files /dev/null and b/docs/_images/volume-backup-06_creodias.png differ diff --git a/docs/_images/volume-backup-07_creodias.png b/docs/_images/volume-backup-07_creodias.png new file mode 100644 index 0000000..7fc3c83 Binary files /dev/null and b/docs/_images/volume-backup-07_creodias.png differ diff --git a/docs/_images/volume-backup-08_creodias.png b/docs/_images/volume-backup-08_creodias.png new file mode 100644 index 0000000..d12a340 Binary files /dev/null and b/docs/_images/volume-backup-08_creodias.png differ diff --git a/docs/_images/volume-backup-09_creodias.png b/docs/_images/volume-backup-09_creodias.png new file mode 100644 index 0000000..1d9f8cf Binary files /dev/null and b/docs/_images/volume-backup-09_creodias.png differ diff --git a/docs/_images/volume-backup-10_creodias.png b/docs/_images/volume-backup-10_creodias.png new file mode 100644 index 0000000..dddde0f Binary files /dev/null and b/docs/_images/volume-backup-10_creodias.png differ diff --git a/docs/_images/volume-backup-11_creodias.png b/docs/_images/volume-backup-11_creodias.png new file mode 100644 index 0000000..bdcd749 Binary files /dev/null and b/docs/_images/volume-backup-11_creodias.png differ diff --git a/docs/_images/volume-backup-12_creodias.png b/docs/_images/volume-backup-12_creodias.png new file mode 100644 index 0000000..815e66e Binary files /dev/null and b/docs/_images/volume-backup-12_creodias.png differ diff --git a/docs/_images/volume-backup-13_creodias.png b/docs/_images/volume-backup-13_creodias.png new file mode 100644 index 0000000..550f973 Binary files /dev/null and b/docs/_images/volume-backup-13_creodias.png differ diff --git a/docs/_images/volume-backup-14_creodias.png b/docs/_images/volume-backup-14_creodias.png new file mode 100644 index 0000000..8933017 Binary files /dev/null and b/docs/_images/volume-backup-14_creodias.png differ diff --git a/docs/_images/volume-backup-15_creodias.png b/docs/_images/volume-backup-15_creodias.png new file mode 100644 index 0000000..3c0ad1d Binary files /dev/null and b/docs/_images/volume-backup-15_creodias.png differ diff --git a/docs/_images/volume-backup-16_creodias.png b/docs/_images/volume-backup-16_creodias.png new file mode 100644 index 0000000..03b8b37 Binary files /dev/null and b/docs/_images/volume-backup-16_creodias.png differ diff --git a/docs/_images/volume-backup-17_creodias.png b/docs/_images/volume-backup-17_creodias.png new file mode 100644 index 0000000..a75c949 Binary files /dev/null and b/docs/_images/volume-backup-17_creodias.png differ diff --git a/docs/_images/volume-backup-18_creodias.png b/docs/_images/volume-backup-18_creodias.png new file mode 100644 index 0000000..b2b6a07 Binary files /dev/null and b/docs/_images/volume-backup-18_creodias.png differ diff --git a/docs/_images/volume-less-01_creodias.png b/docs/_images/volume-less-01_creodias.png new file mode 100644 index 0000000..dd356d3 Binary files /dev/null and b/docs/_images/volume-less-01_creodias.png differ diff --git a/docs/_images/volume-less-02_creodias.png b/docs/_images/volume-less-02_creodias.png new file mode 100644 index 0000000..e4bfe53 Binary files /dev/null and b/docs/_images/volume-less-02_creodias.png differ diff --git a/docs/_images/volume-less-03_creodias.png b/docs/_images/volume-less-03_creodias.png new file mode 100644 index 0000000..e912c37 Binary files /dev/null and b/docs/_images/volume-less-03_creodias.png differ diff --git a/docs/_images/volume-less-04_creodias.png b/docs/_images/volume-less-04_creodias.png new file mode 100644 index 0000000..84ea25f Binary files /dev/null and b/docs/_images/volume-less-04_creodias.png differ diff --git a/docs/_images/volume-less-05_creodias.png b/docs/_images/volume-less-05_creodias.png new file mode 100644 index 0000000..5a5824a Binary files /dev/null and b/docs/_images/volume-less-05_creodias.png differ diff --git a/docs/_images/volume-less-06_creodias.png b/docs/_images/volume-less-06_creodias.png new file mode 100644 index 0000000..223486b Binary files /dev/null and b/docs/_images/volume-less-06_creodias.png differ diff --git a/docs/_images/volume-less-07_creodias.png b/docs/_images/volume-less-07_creodias.png new file mode 100644 index 0000000..d8f6456 Binary files /dev/null and b/docs/_images/volume-less-07_creodias.png differ diff --git a/docs/_images/volume-less-08_creodias.png b/docs/_images/volume-less-08_creodias.png new file mode 100644 index 0000000..e2fba3c Binary files /dev/null and b/docs/_images/volume-less-08_creodias.png differ diff --git a/docs/_images/volume-less-09_creodias.png b/docs/_images/volume-less-09_creodias.png new file mode 100644 index 0000000..b1ed092 Binary files /dev/null and b/docs/_images/volume-less-09_creodias.png differ diff --git a/docs/_images/volume-less-10_creodias.png b/docs/_images/volume-less-10_creodias.png new file mode 100644 index 0000000..188912d Binary files /dev/null and b/docs/_images/volume-less-10_creodias.png differ diff --git a/docs/_images/volume-less-11_creodias.png b/docs/_images/volume-less-11_creodias.png new file mode 100644 index 0000000..88316d3 Binary files /dev/null and b/docs/_images/volume-less-11_creodias.png differ diff --git a/docs/_images/volume-more-01_creodias.png b/docs/_images/volume-more-01_creodias.png new file mode 100644 index 0000000..dd356d3 Binary files /dev/null and b/docs/_images/volume-more-01_creodias.png differ diff --git a/docs/_images/volume-more-02_creodias.png b/docs/_images/volume-more-02_creodias.png new file mode 100644 index 0000000..e4bfe53 Binary files /dev/null and b/docs/_images/volume-more-02_creodias.png differ diff --git a/docs/_images/volume-more-03_creodias.png b/docs/_images/volume-more-03_creodias.png new file mode 100644 index 0000000..d8bf2ec Binary files /dev/null and b/docs/_images/volume-more-03_creodias.png differ diff --git a/docs/_images/volume-more-04_creodias.png b/docs/_images/volume-more-04_creodias.png new file mode 100644 index 0000000..57b8932 Binary files /dev/null and b/docs/_images/volume-more-04_creodias.png differ diff --git a/docs/_images/volume-more-05_creodias.png b/docs/_images/volume-more-05_creodias.png new file mode 100644 index 0000000..a6adaf9 Binary files /dev/null and b/docs/_images/volume-more-05_creodias.png differ diff --git a/docs/_images/volume-more-06_creodias.png b/docs/_images/volume-more-06_creodias.png new file mode 100644 index 0000000..4e6bf5a Binary files /dev/null and b/docs/_images/volume-more-06_creodias.png differ diff --git a/docs/_images/volume-more-07_creodias.png b/docs/_images/volume-more-07_creodias.png new file mode 100644 index 0000000..930a9cc Binary files /dev/null and b/docs/_images/volume-more-07_creodias.png differ diff --git a/docs/_images/volume-more-08_creodias.png b/docs/_images/volume-more-08_creodias.png new file mode 100644 index 0000000..084fdf0 Binary files /dev/null and b/docs/_images/volume-more-08_creodias.png differ diff --git a/docs/_images/volume-more-09_creodias.png b/docs/_images/volume-more-09_creodias.png new file mode 100644 index 0000000..3cedbfc Binary files /dev/null and b/docs/_images/volume-more-09_creodias.png differ diff --git a/docs/_images/volume-more-10_creodias.png b/docs/_images/volume-more-10_creodias.png new file mode 100644 index 0000000..188912d Binary files /dev/null and b/docs/_images/volume-more-10_creodias.png differ diff --git a/docs/_images/volume-more-11_creodias.png b/docs/_images/volume-more-11_creodias.png new file mode 100644 index 0000000..f5fb763 Binary files /dev/null and b/docs/_images/volume-more-11_creodias.png differ diff --git a/docs/_images/volumes.png b/docs/_images/volumes.png new file mode 100644 index 0000000..cc419c5 Binary files /dev/null and b/docs/_images/volumes.png differ diff --git a/docs/_images/volyes1.png b/docs/_images/volyes1.png new file mode 100644 index 0000000..ba8f2bc Binary files /dev/null and b/docs/_images/volyes1.png differ diff --git a/docs/_images/volyes10.png b/docs/_images/volyes10.png new file mode 100644 index 0000000..6eaf4c7 Binary files /dev/null and b/docs/_images/volyes10.png differ diff --git a/docs/_images/volyes11.png b/docs/_images/volyes11.png new file mode 100644 index 0000000..0f6f3f9 Binary files /dev/null and b/docs/_images/volyes11.png differ diff --git a/docs/_images/volyes12.png b/docs/_images/volyes12.png new file mode 100644 index 0000000..b6cf398 Binary files /dev/null and b/docs/_images/volyes12.png differ diff --git a/docs/_images/volyes13.png b/docs/_images/volyes13.png new file mode 100644 index 0000000..f31874b Binary files /dev/null and b/docs/_images/volyes13.png differ diff --git a/docs/_images/volyes14.png b/docs/_images/volyes14.png new file mode 100644 index 0000000..273c0c3 Binary files /dev/null and b/docs/_images/volyes14.png differ diff --git a/docs/_images/volyes15.png b/docs/_images/volyes15.png new file mode 100644 index 0000000..1b49e3d Binary files /dev/null and b/docs/_images/volyes15.png differ diff --git a/docs/_images/volyes16.png b/docs/_images/volyes16.png new file mode 100644 index 0000000..5bed0ad Binary files /dev/null and b/docs/_images/volyes16.png differ diff --git a/docs/_images/volyes2.png b/docs/_images/volyes2.png new file mode 100644 index 0000000..16c986d Binary files /dev/null and b/docs/_images/volyes2.png differ diff --git a/docs/_images/volyes3.png b/docs/_images/volyes3.png new file mode 100644 index 0000000..67ff79a Binary files /dev/null and b/docs/_images/volyes3.png differ diff --git a/docs/_images/volyes4.png b/docs/_images/volyes4.png new file mode 100644 index 0000000..1ee177d Binary files /dev/null and b/docs/_images/volyes4.png differ diff --git a/docs/_images/volyes5.png b/docs/_images/volyes5.png new file mode 100644 index 0000000..f72a94d Binary files /dev/null and b/docs/_images/volyes5.png differ diff --git a/docs/_images/volyes6.png b/docs/_images/volyes6.png new file mode 100644 index 0000000..bb29abd Binary files /dev/null and b/docs/_images/volyes6.png differ diff --git a/docs/_images/volyes7.png b/docs/_images/volyes7.png new file mode 100644 index 0000000..d24915d Binary files /dev/null and b/docs/_images/volyes7.png differ diff --git a/docs/_images/volyes8.png b/docs/_images/volyes8.png new file mode 100644 index 0000000..622f4fc Binary files /dev/null and b/docs/_images/volyes8.png differ diff --git a/docs/_images/volyes9.png b/docs/_images/volyes9.png new file mode 100644 index 0000000..c496173 Binary files /dev/null and b/docs/_images/volyes9.png differ diff --git a/docs/_images/wallets_contracts_cloudferrocloud.png b/docs/_images/wallets_contracts_cloudferrocloud.png new file mode 100644 index 0000000..ed5adb9 Binary files /dev/null and b/docs/_images/wallets_contracts_cloudferrocloud.png differ diff --git a/docs/_images/waw3-1-default.png b/docs/_images/waw3-1-default.png new file mode 100644 index 0000000..65b144e Binary files /dev/null and b/docs/_images/waw3-1-default.png differ diff --git a/docs/_images/waw3-2-cloud-activated.png b/docs/_images/waw3-2-cloud-activated.png new file mode 100644 index 0000000..d080cfb Binary files /dev/null and b/docs/_images/waw3-2-cloud-activated.png differ diff --git a/docs/_images/waw3-2-default_templates.png b/docs/_images/waw3-2-default_templates.png new file mode 100644 index 0000000..a34fc4a Binary files /dev/null and b/docs/_images/waw3-2-default_templates.png differ diff --git a/docs/_images/waw4-1-cluster-templates-2.png b/docs/_images/waw4-1-cluster-templates-2.png new file mode 100644 index 0000000..66b4ca1 Binary files /dev/null and b/docs/_images/waw4-1-cluster-templates-2.png differ diff --git a/docs/_images/welcome_nginx.png b/docs/_images/welcome_nginx.png new file mode 100644 index 0000000..b8bc482 Binary files /dev/null and b/docs/_images/welcome_nginx.png differ diff --git a/docs/_images/white_keypair_select.png b/docs/_images/white_keypair_select.png new file mode 100644 index 0000000..8063e0b Binary files /dev/null and b/docs/_images/white_keypair_select.png differ diff --git a/docs/_images/whitelisting-loadbalancer-1.png b/docs/_images/whitelisting-loadbalancer-1.png new file mode 100644 index 0000000..b95fd36 Binary files /dev/null and b/docs/_images/whitelisting-loadbalancer-1.png differ diff --git a/docs/_images/whitelisting-loadbalancer-4.png b/docs/_images/whitelisting-loadbalancer-4.png new file mode 100644 index 0000000..7dc495d Binary files /dev/null and b/docs/_images/whitelisting-loadbalancer-4.png differ diff --git a/docs/_images/whitelisting-loadbalancer-5.png b/docs/_images/whitelisting-loadbalancer-5.png new file mode 100644 index 0000000..998bb31 Binary files /dev/null and b/docs/_images/whitelisting-loadbalancer-5.png differ diff --git a/docs/_images/whitelisting_again-1.png b/docs/_images/whitelisting_again-1.png new file mode 100644 index 0000000..6cf313b Binary files /dev/null and b/docs/_images/whitelisting_again-1.png differ diff --git a/docs/_images/whitelisting_again-2.png b/docs/_images/whitelisting_again-2.png new file mode 100644 index 0000000..c788a67 Binary files /dev/null and b/docs/_images/whitelisting_again-2.png differ diff --git a/docs/_images/whitelisting_again-3.png b/docs/_images/whitelisting_again-3.png new file mode 100644 index 0000000..3f9f46d Binary files /dev/null and b/docs/_images/whitelisting_again-3.png differ diff --git a/docs/_images/whitelisting_again-4v2.png b/docs/_images/whitelisting_again-4v2.png new file mode 100644 index 0000000..c157ae0 Binary files /dev/null and b/docs/_images/whitelisting_again-4v2.png differ diff --git a/docs/_images/whitelisting_again-5v2.png b/docs/_images/whitelisting_again-5v2.png new file mode 100644 index 0000000..8465ee0 Binary files /dev/null and b/docs/_images/whitelisting_again-5v2.png differ diff --git a/docs/_images/whitelisting_again-7v2.png b/docs/_images/whitelisting_again-7v2.png new file mode 100644 index 0000000..67f1e1d Binary files /dev/null and b/docs/_images/whitelisting_again-7v2.png differ diff --git a/docs/_images/whitelisting_again-8v2.png b/docs/_images/whitelisting_again-8v2.png new file mode 100644 index 0000000..c9bd508 Binary files /dev/null and b/docs/_images/whitelisting_again-8v2.png differ diff --git a/docs/_images/whitelisting_again-9v2.png b/docs/_images/whitelisting_again-9v2.png new file mode 100644 index 0000000..701d580 Binary files /dev/null and b/docs/_images/whitelisting_again-9v2.png differ diff --git a/docs/_images/worker_nodes_number.png b/docs/_images/worker_nodes_number.png new file mode 100644 index 0000000..a856162 Binary files /dev/null and b/docs/_images/worker_nodes_number.png differ diff --git a/docs/_images/wsl01_creodias.png b/docs/_images/wsl01_creodias.png new file mode 100644 index 0000000..dc82f72 Binary files /dev/null and b/docs/_images/wsl01_creodias.png differ diff --git a/docs/_images/wsl02_creodias.png b/docs/_images/wsl02_creodias.png new file mode 100644 index 0000000..c9d4788 Binary files /dev/null and b/docs/_images/wsl02_creodias.png differ diff --git a/docs/_images/wsl03_creodias.png b/docs/_images/wsl03_creodias.png new file mode 100644 index 0000000..21682ab Binary files /dev/null and b/docs/_images/wsl03_creodias.png differ diff --git a/docs/_images/wsl04_creodias.png b/docs/_images/wsl04_creodias.png new file mode 100644 index 0000000..26a881d Binary files /dev/null and b/docs/_images/wsl04_creodias.png differ diff --git a/docs/_images/wsl05_creodias.png b/docs/_images/wsl05_creodias.png new file mode 100644 index 0000000..91e209e Binary files /dev/null and b/docs/_images/wsl05_creodias.png differ diff --git a/docs/_images/wsl06_creodias.png b/docs/_images/wsl06_creodias.png new file mode 100644 index 0000000..3d6bc91 Binary files /dev/null and b/docs/_images/wsl06_creodias.png differ diff --git a/docs/_images/wsl07_creodias.png b/docs/_images/wsl07_creodias.png new file mode 100644 index 0000000..9086259 Binary files /dev/null and b/docs/_images/wsl07_creodias.png differ diff --git a/docs/_images/wsl08_creodias.png b/docs/_images/wsl08_creodias.png new file mode 100644 index 0000000..2a7daf4 Binary files /dev/null and b/docs/_images/wsl08_creodias.png differ diff --git a/docs/_images/wsl09_creodias.png b/docs/_images/wsl09_creodias.png new file mode 100644 index 0000000..230aa83 Binary files /dev/null and b/docs/_images/wsl09_creodias.png differ diff --git a/docs/_images/wsl10_creodias.png b/docs/_images/wsl10_creodias.png new file mode 100644 index 0000000..b837d7c Binary files /dev/null and b/docs/_images/wsl10_creodias.png differ diff --git a/docs/_images/wsl11_creodias.png b/docs/_images/wsl11_creodias.png new file mode 100644 index 0000000..ddf3a63 Binary files /dev/null and b/docs/_images/wsl11_creodias.png differ diff --git a/docs/_images/wsl12_creodias.png b/docs/_images/wsl12_creodias.png new file mode 100644 index 0000000..e781eec Binary files /dev/null and b/docs/_images/wsl12_creodias.png differ diff --git a/docs/_images/wsl13_creodias.png b/docs/_images/wsl13_creodias.png new file mode 100644 index 0000000..96364d9 Binary files /dev/null and b/docs/_images/wsl13_creodias.png differ diff --git a/docs/_images/wsl14_creodias.png b/docs/_images/wsl14_creodias.png new file mode 100644 index 0000000..2645266 Binary files /dev/null and b/docs/_images/wsl14_creodias.png differ diff --git a/docs/_images/wsl15_creodias.png b/docs/_images/wsl15_creodias.png new file mode 100644 index 0000000..20f41c9 Binary files /dev/null and b/docs/_images/wsl15_creodias.png differ diff --git a/docs/_images/wsl16_creodias.png b/docs/_images/wsl16_creodias.png new file mode 100644 index 0000000..54f958e Binary files /dev/null and b/docs/_images/wsl16_creodias.png differ diff --git a/docs/_images/wsl17_creodias.png b/docs/_images/wsl17_creodias.png new file mode 100644 index 0000000..7c32a23 Binary files /dev/null and b/docs/_images/wsl17_creodias.png differ diff --git a/docs/_images/wsl18_creodias.png b/docs/_images/wsl18_creodias.png new file mode 100644 index 0000000..53615a2 Binary files /dev/null and b/docs/_images/wsl18_creodias.png differ diff --git a/docs/_images/wsl19_creodias.png b/docs/_images/wsl19_creodias.png new file mode 100644 index 0000000..9b60c76 Binary files /dev/null and b/docs/_images/wsl19_creodias.png differ diff --git a/docs/_images/wsl20_creodias.png b/docs/_images/wsl20_creodias.png new file mode 100644 index 0000000..7f9792f Binary files /dev/null and b/docs/_images/wsl20_creodias.png differ diff --git a/docs/_images/wsl_v1_error_message.png b/docs/_images/wsl_v1_error_message.png new file mode 100644 index 0000000..7c381e8 Binary files /dev/null and b/docs/_images/wsl_v1_error_message.png differ diff --git a/docs/_images/yellow_triangles.png b/docs/_images/yellow_triangles.png new file mode 100644 index 0000000..71f17fe Binary files /dev/null and b/docs/_images/yellow_triangles.png differ diff --git a/docs/accountmanagement/Adding-Editing-Organizations.html.md b/docs/accountmanagement/Adding-Editing-Organizations.html.md new file mode 100644 index 0000000..9b3e52e --- /dev/null +++ b/docs/accountmanagement/Adding-Editing-Organizations.html.md @@ -0,0 +1,21 @@ +Adding and editing Organization[](#adding-and-editing-organization "Permalink to this headline") +================================================================================================= + +After logging into press **Organization** button on the left bar menu. + +![register_organization_cloudferrocloud.png](../_images/register_organization_cloudferrocloud.png) + +In **My Organization** tab you can register an organization and become its administrator or join an organization if you have invitation code provided by it’s administrator. + +To register new organization please fill up all fields marked with **\*** and press **Register Organization** button. +Once you register your organization you will be able to view and edit details. + +TAX ID / VAT field is not required but without providing the data you wont be able to complete automatic order or start new contract. VAT field is required if you need to receive invoice with correct tax rate. + +After registration, please go back to the left bar menu and select **Organization**. + +In **My Organization** tab you will be able to: + +> * check organization registration date +> * view and edit organization name, address and TAX ID / VAT number +> * manage assignments \ No newline at end of file diff --git a/docs/accountmanagement/Contracts-Wallets.html.md b/docs/accountmanagement/Contracts-Wallets.html.md new file mode 100644 index 0000000..b92a6c6 --- /dev/null +++ b/docs/accountmanagement/Contracts-Wallets.html.md @@ -0,0 +1,38 @@ +Wallets and Contracts Management[](#wallets-and-contracts-management "Permalink to this headline") +=================================================================================================== + +After logging into press **Wallets/Contracts** button on the left menu bar: + +![wallets_contracts_cloudferrocloud.png](../_images/wallets_contracts_cloudferrocloud.png) + +you will see the following 3 billing modes: + +**PPUSE (Pay Per Use Wallet)** + +This is a prepaid billing mode where services are billed according to usage. Tenant purchases a credit in a form of Billing Units (BU) with are added to his system wallet and are used to provision and keep resources and services. Billing Units (BU) are evaluated to 1 Euro for the sake of Price List. Billing Units (BU) are purchased through e-commerce or written contracts. Every 2 h tenant credit is decreased with the cost of used resources billed with an accuracy of up to 2 seconds. This is a very flexible mode that allows to create and remove resources at will and pay only for the used resources. This is a mode useful for experimental and development work or for environments with very variable resources. + +To add an additional wallet please click **Add wallet** button on the top. +To add funds to your already created wallet you need to use **Transfer funds** option. +Please note that a wallet can be deleted once all funds are transferred to another wallet. +You can check your billing by clicking **Billing report** button. + +**PAYG (Pay As You Go Contract)** + +This is a postpaid billing mode where Tenants are invoiced periodically based on actual usage. In this mode, a Tenant signs a written contract and is billed usually on monthly bases for actual usage of services and resources. PAYG contracts are purchased only through our sales department in a form of written contracts. With the exception of FIXED-TERM orders all services and resources ordered under Accounts/Projects that are attached to the PAYG contract will be added to the invoice issued at the end of agreed period. Billing is done every 2 hours. Tenants sees the increase in usage with the cost of used resources billed with an accuracy of up to 2 seconds. + +To add PAYG wallet you need to raise a ticket first (please check [Helpdesk and Support](Help-Desk-And-Support.html)). + +**FIXED-TERM (Fixed Term Contract)** + +This is a billing mode where services are bought for longer periods. In this mode, Tenant purchases defined services for defined periods. FIXED-TERM contracts are purchased through e-commerce or written agreements. The long-term resources are paid directly according to price and currency stated. One cannot then change these resources but on the other hand obtains much cheaper offering. This mode is preferable for long-term usage of well-defined environments with well understood needs. + +In order to successfully apply FIXED-TERM billing mode to given service in particular billing session, the contract is required to fulfill the following conditions: + +> * Be active at the beginning of the session or at the moment when resource is launched; +> * Be active till the end of the 2 hours billing session. + +If any of the conditions listed above is not met, service is to be billed in PPU/PAYG mode. + +As a result of described billing system behavior, if contract is activated after launching services, FIXED-TERM billing mode is to be applied to them at the beginning of next billing session and not immediately. + +To check **how to add wallet to specific project** please visit /accountmanagement/Accounts-and-Projects-Management. \ No newline at end of file diff --git a/docs/accountmanagement/Cookie-consent-on-CloudFerro-Cloud.html.md b/docs/accountmanagement/Cookie-consent-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..62d3816 --- /dev/null +++ b/docs/accountmanagement/Cookie-consent-on-CloudFerro-Cloud.html.md @@ -0,0 +1,152 @@ +Cookie consent on CloudFerro Cloud[](#cookie-consent-on-brand-name "Permalink to this headline") +================================================================================================= + +A *cookie* is a small text file that your browser stores in local environment and later uses to track or recognize your activities on the site. + +Cookies are an essential tool for the remote site to deliver the best possible user experience. The downside for the user is the potential loss of online privacy which may, among other reasons, be caused by + +> * the site itself (if it uses its own cookies in a way that is detrimental to the user), +> * by many other sites that see available cookies and decide to gather reconnaissance about your surfing activities. + +Introducing Cookiebot site[](#introducing-cookiebot-site "Permalink to this headline") +--------------------------------------------------------------------------------------- + +CloudFerro Cloud is using [Cookiebot](https://www.cookiebot.com/) software to manage **cookies consent** from the user. It will show you all of the cookies that your browser is storing and you will be able to choose which types of cookies should CloudFerro Cloud take into account. Both Cookiebot and CloudFerro Cloud site are [GDPR compliant](https://gdpr-info.eu/), however, CloudFerro Cloud also has its own [Privacy Policy](https://cloudferro.com/privacy-policy/) in effect. + +Of particular relevance is Cookiebot page [Logging and demonstration of user consents](https://support.cookiebot.com/hc/en-us/articles/360003782654-Logging-and-demonstration-of-user-consents). + +Note + +You can directly interfere with cookies from your browser, operating system, network or VPN access software. This boils down to detecting, showing, hiding, tracking or removing access to certain types of cookies and so on. These methods are, however, out of scope of this article. + +Cookiebot window[](#cookiebot-window "Permalink to this headline") +------------------------------------------------------------------- + +This is the Cookiebot window on CloudFerro Cloud: + +![cookie-consent-cloudferro-cloud-1.png](../_images/cookie-consent-cloudferro-cloud-1.png) + +You will see it when visiting one of these sites for the first time: + +* the **main site** itself, , +* in **AI platform** , +* on **ecommerce page**, , or in +* the **dashboard**, . + +Cookiebot is interactive and you can change your cookies preferences while using the site. If the consent for using cookies was withdrawn, you are also going to see the same starting Cookiebot window when visiting these sites after the change. + +Option Allow all[](#option-allow-all "Permalink to this headline") +------------------------------------------------------------------- + +Click on button **Allow all** will do what it says – the site will record **all** types of cookies and, consequently, to track your behaviour completely. This option will unleash the full power of the site and you will always be able to use all of its capabilities. For you as the user, it is also the easiest and fastest way of dealing with cookies on the site. + +Details view of available cookies[](#details-view-of-available-cookies "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +To see the cookies that you can give your consent to, click on **Details**. + +![cookie-consent-cloudferro-cloud-2.png](../_images/cookie-consent-cloudferro-cloud-2.png) + +There are five types of cookies and you may need to scroll down to see them all. + +When shown for the first time, the left button will contain label **Deny**. Choosing it will turn off all of the cookies apart from the **Necessary cookie** type, which by default cannot be turned off. If you do not like the fact that that is the default, refrain from using the site. + +### Necessary cookies[](#necessary-cookies "Permalink to this headline") + +This is the most basic type of cookie and the site presumes you have already given consent to it. That is why the check button to the right of the row, ![COOKIE-BUTTON](_images/cookie-consent-for-site-1.png), is already set to “ON”. Technically, you can try to remove the consent by clicking on that button, but you will be met with a message like this: + +![cookie-consent-cloudferro-cloud-13.png](../_images/cookie-consent-cloudferro-cloud-13.png) + +You can also see additional details about that cookie type and the cookies it contains. By clicking on the name of the cookie, you will be able to see from which company it is, what it looks like and so on. + +![cookie-consent-cloudferro-cloud-15.png](../_images/cookie-consent-cloudferro-cloud-15.png) + +### The number of cookies shown per category[](#the-number-of-cookies-shown-per-category "Permalink to this headline") + +The number of cookies that Cookiebot is showing may vary wildly and will be increased if the sites you visit are using: + +> * interactive elements, such as chat widgets, embedded maps, videos etc. +> * advertising networks, +> * analytics tools, +> * CDN (Content Delivery Network), +> * recommendations, +> * affiliate marketing, +> * testing procedures + +and so on. + +Some large content sites may use up to 30-40 cookies per visitor – that alone will increase the general number of cookies you see through Cookiebot. + +If you delete some or all cookies, perhaps using the browser of your choice, the numbers the Cookiebot will show will be almost zero (but with each visit to another site or sites, that number is almost sure to grow). + +### Preferences cookie type[](#preferences-cookie-type "Permalink to this headline") + +Enabling this cookie permits the site to store the preferences such as preferred language or region you are in. + +### Statistics cookie type[](#statistics-cookie-type "Permalink to this headline") + +For storing anonymized statistics. In spite of your data being stored in the background of the site, these cookies will not be revealed to third parties (unless forced by law). + +### Marketing cookie type[](#marketing-cookie-type "Permalink to this headline") + +Used to create user profiles to send advertising. If you opt out of this cookie type, you may miss some new features of the site or, eventually, miss on promotional campaigns, sales offers and so on. + +### Unclassified cookie type[](#unclassified-cookie-type "Permalink to this headline") + +All other types of cookies, if any, that have not been classified as yet. + +How to give consent to cookie types[](#how-to-give-consent-to-cookie-types "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +Click on toggle button on the right side of the form window and when you finish selecting, click on **Allow selection** to confirm, or again, click on **Allow all** to activate all of them. + +### About cookie consent[](#about-cookie-consent "Permalink to this headline") + +This option explains what cookies are and also provides links to [Privacy Policy](https://cloudferro.com/privacy-policy/) and, more specifically, to [Cookie Policy](https://cloudferro.com/cookie-policy/). + +![cookie-consent-cloudferro-cloud-4.png](../_images/cookie-consent-cloudferro-cloud-4.png) + +You can still change cookie consent by clicking on **Customize**, which will lead you back to **Details** tab (already explained above). + +Selecting the cookies preferences[](#selecting-the-cookies-preferences "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +Once you click either **Allow selection** or **Allow all** buttons, the form will disappear and your selection will be fixed. To change it, click on icon ![COORANGE](_images/cookie-consent-cloudferro-cloud-12.png) in the lower left browser window corner. + +![cookie-consent-cloudferro-cloud-5.png](../_images/cookie-consent-cloudferro-cloud-5.png) + +A smaller window will appear: + +![cookie-consent-cloudferro-cloud-6.png](../_images/cookie-consent-cloudferro-cloud-6.png) + +Clicking on **Withdraw your consent**, all types of cookies will be annulled except the necessary one. + +Button **Change your consent** will lead to the **Details** tab we already discussed, where you will be able to edit your cookies preferences. + +### What the consent data look like[](#what-the-consent-data-look-like "Permalink to this headline") + +To see what your consent data look like, click on **Show details**: + +![cookie-consent-cloudferro-cloud-7.png](../_images/cookie-consent-cloudferro-cloud-7.png) + +Each consent you give to the site, generates a unique consent ID, which, together with the time and date, you can see in the image above. Consent ID is random, anonymous, encrypted and unique. In that way, user anonymity is preserved while the site is still in a position to conclude whether the consent was actually provided or not. + +The cookie is saved on backend servers for 12 months. It is also saved in your browser so that the website can automatically read and respect the user’s consent on all subsequent page requests. + +Troubleshooting[](#troubleshooting "Permalink to this headline") +----------------------------------------------------------------- + +You can see the contents of the cookie file through various browser options and also through a file viewer on your desktop computer. It is quite possible (but not at all advisable) to delete the cookie file outside of the browser. In particular, deleting the entire cookie by force will also delete the **necessary** part of the cookie. You may, then, lose access to the site, be forced to contact [Helpdesk and Support](Help-Desk-And-Support.html) and so on. + +Setting up cookies on CloudFerro Cloud subdomains[](#setting-up-cookies-on-brand-name-subdomains "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +Cookiebot procedures are exactly the same on subdomains or the dashboard. + +Here is what cookie consent window will look like, for example, on : + +![cookie-consent-cloudferro-cloud-8.png](../_images/cookie-consent-cloudferro-cloud-8.png) + +Set the cookies up by clicking on ![CO](_images/cookie-consent-cloudferro-cloud-11.png) icon in the lover left part of the browser window. + +![cookie-consent-cloudferro-cloud-9.png](../_images/cookie-consent-cloudferro-cloud-9.png) \ No newline at end of file diff --git a/docs/accountmanagement/Editing-Profile.html.md b/docs/accountmanagement/Editing-Profile.html.md new file mode 100644 index 0000000..af8cbdc --- /dev/null +++ b/docs/accountmanagement/Editing-Profile.html.md @@ -0,0 +1,13 @@ +Editing profile[](#editing-profile "Permalink to this headline") +================================================================= + +After logging into press **My Profile** button on the left bar menu. + +![editing_profile_cloudferrocloud.png](../_images/editing_profile_cloudferrocloud.png) + +In **My Profile** tab you will be able to: + +> * check your email address and registration date +> * view and edit your name and country +> * change your password +> * view and edit accepted agreements \ No newline at end of file diff --git a/docs/accountmanagement/Forgotten-Password.html.md b/docs/accountmanagement/Forgotten-Password.html.md new file mode 100644 index 0000000..ffdfb1e --- /dev/null +++ b/docs/accountmanagement/Forgotten-Password.html.md @@ -0,0 +1,17 @@ +Forgotten Password[](#forgotten-password "Permalink to this headline") +======================================================================= + +Go to the login page and click on **Forgot Password** button. + +![forgot_your_password_cloudferrocloud.png](../_images/forgot_your_password_cloudferrocloud.png) + +Enter your email address into the field and press **Submit** button. Check your mailbox for further steps. + +Open the link from email and set up a new password. + +After that, click **Submit** button. + +![enter_new_password_cloudferrocloud.png](../_images/enter_new_password_cloudferrocloud.png) + +If you haven’t received a message, check your SPAM folder. If you forgot the email address or the message can’t be +delivered successfully, please contact our Support Team. \ No newline at end of file diff --git a/docs/accountmanagement/Help-Desk-And-Support.html.md b/docs/accountmanagement/Help-Desk-And-Support.html.md new file mode 100644 index 0000000..d830d8b --- /dev/null +++ b/docs/accountmanagement/Help-Desk-And-Support.html.md @@ -0,0 +1,23 @@ +Helpdesk and Support[](#helpdesk-and-support "Permalink to this headline") +=========================================================================== + +After logging into press the **Tickets** button on the left menu bar to create or manage your tickets. + +![tickets_cloudferrocloud.png](../_images/tickets_cloudferrocloud.png) + +There are few tabs available in Tickets menu: + +> * **ALL** - allows you to view all your tickets +> * **OPEN** - shows your open tickets +> * **CLOSED** - contains list of closed tickets + +As it is shown on the above picture, all tickets are categorized by Key, Topic, Status, Type, Created date and Last update date. +You can sort your tickets by **Type**. For this purpose choose **Support**, **Problems**, **Sales**, **Billing and Accounting**, from the top drop down list. +To check details or add a comment to existing tickets, please use **Show details** option on the right side of the window. + +If you want to create a new ticket, press **Add ticket** button on the top of the side. + +![add_ticket_cloudferrocloud.png](../_images/add_ticket_cloudferrocloud.png) + +Choose proper category, add **Summary**, describe the issue and press **Create request** button. +Once you press the button ticket will be visible in the **OPEN** tab. \ No newline at end of file diff --git a/docs/accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html.md b/docs/accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html.md new file mode 100644 index 0000000..05b027d --- /dev/null +++ b/docs/accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html.md @@ -0,0 +1,275 @@ +How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication[](#how-to-activate-openstack-cli-access-to-brand-name-cloud-using-one-or-two-factor-authentication "Permalink to this headline") +======================================================================================================================================================================================================================================== + +One-factor and two-factor authentication for activating command line access to the cloud[](#one-factor-and-two-factor-authentication-for-activating-command-line-access-to-the-cloud "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +To log into a site, you usually provide user name and email address during the creation of the account and then you use those same data to enter the site. You provide that data once and that is why it is called “one-factor” authentication. Two-factor authentication requires the same but considers it to be only the first step; on CloudFerro Cloud cloud, the second step is + +> * to generate six-digit code using the appropriate software and then to +> * send it to the cloud as a means of additional certification. + +Cloud parameters for authentication and, later, OpenStack CLI access, are found in a so-called *RC file*. This article will help you download and use it to first authenticate and then access the cloud using OpenStack CLI commands. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to download the RC file +> * Adjusting the name of the downloaded RC file +> * The contents of the downloaded RC file +> * How to activate the downloaded RC file +> * One factor authentication +> * Two factor authentication +> * Testing the connection +> * Resolving errors + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **2FA** + +If your account has 2FA enabled (which you will recognize from the respective prompt when authenticating), you need to install and configure a piece of software which generates six-digit codes used for 2FA. To set that up, follow one of these articles, depending on the type of device you are using: + +* Mobile device (Android, iOS): [Two-Factor Authentication to CloudFerro Cloud site using mobile application](Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html) +* Computer [Two-Factor Authentication to CloudFerro Cloud site using KeePassXC on desktop](Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html) + +No. 3 **OpenStackClient installed and available** + +Installing OpenStackClient on various platforms will also install the ability to run the **.sh** files. Since OpenStack is written in Python, it is recommended to use a dedicated virtual environment for the rest of this article. + +Install GitBash on Windows +: Run **.sh** files and install OpenStackClient from a GitBash window under Windows. [How to install OpenStackClient GitBash for Windows on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html). + +Install and run WSL (Linux under Windows) +: Run **.sh** files and install OpenStackClient from a Ubuntu window under Windows. [How to install OpenStackClient on Windows using Windows Subsystem for Linux on CloudFerro Cloud OpenStack Hosting](../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html). + +Install OpenStackClient on Linux +: [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html). + +How to download the RC file[](#how-to-download-the-rc-file "Permalink to this headline") +----------------------------------------------------------------------------------------- + +### Location of the link to RC file[](#location-of-the-link-to-rc-file "Permalink to this headline") + +**Click on account name** + +Top right corner of the Horizon screen contains the account name. Depending on the cloud you are using, you will see a menu like this: + +| | +| --- | +| **WAW3-1, WAW3-2, FRA1-1** | +| ../_images/click_on_email.png | + +**Click on API Access** + +Navigate to **API Access** -> **Download OpenStack RC File**. Depending on the cloud you are using, you will see a menu like this: + +| | +| --- | +| **WAW3-1, WAW3-2, FRA1-1** | +| ../_images/download_rc_file_2fa.png | + +Option **OpenStack clouds.yaml File** is out of scope of this article. + +### Which OpenStack RC file to download[](#which-openstack-rc-file-to-download "Permalink to this headline") + +Choose the appropriate option, depending on the type of account: + +2FA *not* active on the account +: For clouds **WAW3-1, WAW3-2, FRA1-1**, select option **OpenStack RC File**. + +2FA active on the account +: Download file **OpenStack RC File (2FA)**. + +You only need one copy of the RC file at any time. If you downloaded more than one copy of the file to the same folder without moving or renaming them, your operating system may differentiate amongst the downloaded files by adding additional characters at the end of the file name. + +By way of example, let the downloaded RC file name be **cloud\_00734\_1-openrc-2fa.sh**. For your convenience, you may want to + +> * rename it and +> * move to the folder in which you are going to activate it. + +The contents of the downloaded RC file[](#the-contents-of-the-downloaded-rc-file "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +RC file sets up *environment variables* which are used by the OpenStack CLI client to authenticate to the cloud. By convention, these variables are in upper case and start with **OS\_**: **OS\_TENANT\_ID**, **OS\_PROJECT\_NAME** etc. For example, in case of one-factor authentication, the RC file will ask for password and store it into a variable called **OS\_PASSWORD**. + +Below is an example content of an RC file which does not use 2FA: + +![rc_file_content.png](../_images/rc_file_content.png) + +File which supports 2FA will have additional pieces of code for providing the second factor of authentication. + +How to activate the downloaded RC file[](#how-to-activate-the-downloaded-rc-file "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +The activation procedure will depend on the operating system you are working with: + +**Ubuntu** +: Assuming you are in the same folder in which the RC file is present, use the **source** command: + + > ``` + > source ./cloud_00734_1-openrc-2fa.sh + > + > ``` + +**macOS** +: The same **source** command should work on macOS. In some versions of macOS though, an alternative command **zsh** could serve as well: + + ``` + zsh ./cloud_00734_1-openrc-2fa.sh + + ``` + +Note that in both cases **./** means “use the file in this very folder you already are in”. + +**Windows** +: On Windows, to execute file with **.sh** extension, you must have an installed application that can run *Bash* files. + + See Prerequisite No. 3, which describes in more detail how to run **.sh** files using various scenarios on Windows. + +### Running with one-factor authentication[](#running-with-one-factor-authentication "Permalink to this headline") + +The activated **.sh** file will run in a Terminal window (user name is grayed out for privacy reasons): + +![activate-api-2fa-01_creodias.png](../_images/activate-api-2fa-01_creodias.png) + +Enter the password, either by typing it in or by pasting it in the way your terminal supports it, and press **Enter** on the keyboard. The password will not be visible on the screen. + +If your account has only one-factor authentication, this is all you need to do to start running commands from command line. + +### Two-factor authentication[](#two-factor-authentication "Permalink to this headline") + +If your file supports two-factor authentication, the terminal will first require the password, exactly the same as in case of one-factor authentication. Then you will get a prompt for the second factor, which usually comes in shape of a six-digit one-time password: + +![activate-api-2fa-02_creodias.png](../_images/activate-api-2fa-02_creodias.png) + +To get the six digit code, run the app that you are using for authentication. As recommended in **Prerequisite No. 2**, it may be + +> * FreeOTP on mobile, +> * KeePassXC on desktop, or you may run +> * other software of your choice, or you can even write +> * your own Python or Bash code to generate the six digit code. + +Let’s say that, for example, you are using FreeOTP on mobile device and that this is the icon you assigned to your account: + +[![freeotp_icon_to_select.png](../_images/freeotp_icon_to_select.png)](../_images/freeotp_icon_to_select.png) + +Tap on it and the six-digit number will appear: + +[![freeotp_tapped_number.png](../_images/freeotp_tapped_number.png)](../_images/freeotp_tapped_number.png) + +This six-digit number will be regenerated every thirty seconds. Enter the latest number into the Terminal window and press **Enter** on the keyboard. If everything worked correctly, after a few seconds you should return to your normal command prompt with no additional output: + +![activate-api-2fa-03_creodias.png](../_images/activate-api-2fa-03_creodias.png) + +Duration of life for environment variables set by sourcing the RC file[](#duration-of-life-for-environment-variables-set-by-sourcing-the-rc-file "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +When you source the file, environment variables are set for your current shell. To prove it, open two terminal windows, source the RC file in one of them but not in the other and you won’t be able to authenticate from that second terminal window. + +That is why you will need to activate your RC file each time you start a new terminal session. Once authenticated and while that terminal window is open, you can use it to issue OpenStack CLI commands at will. + +Testing the connection[](#testing-the-connection "Permalink to this headline") +------------------------------------------------------------------------------- + +If not already, install OpenStack client using one of the links in Prerequisite No 3. To verify access, execute the following command which lists flavors available in CloudFerro Cloud cloud: + +``` +openstack flavor list + +``` + +You should get output similar to this: + +![flavor_list_2fa_short.png](../_images/flavor_list_2fa_short.png) + +Resolving errors[](#resolving-errors "Permalink to this headline") +------------------------------------------------------------------- + +### jq not installed[](#jq-not-installed "Permalink to this headline") + +**jq** is an app to parse JSON input. In this context, it serves to process the output from the server. It will be installed on most Linux distros. If you do not have it installed on your computer, you may get a message like this: + +![jq_error.png](../_images/jq_error.png) + +To resolve, [download from the official support page and follow the directions to install on your operating system](https://jqlang.github.io/jq/download/). + +If you are using Git Bash on Windows and running into this error, Step 6 of article on GitBash from **Prerequisite 3**, has proper instructions for installing **jq**. + +### 2FA accounts: entering a wrong password and/or six-digit code[](#fa-accounts-entering-a-wrong-password-and-or-six-digit-code "Permalink to this headline") + +If you enter a wrong six-digit code, you will get the following error: + +``` +Call to Keycloak failed with code 401 and message + { + "error": "invalid_grant", + "error_description": "Invalid user credentials" +} + +``` + +If that is the case, simply activate the RC file again as previously and type the correct credentials. + +### 2FA accounts: lost Internet connection[](#fa-accounts-lost-internet-connection "Permalink to this headline") + +Activating a 2FA RC file requires access to CloudFerro Cloud account service because it involves not only setting variables, but also obtaining an appropriate token. + +If you do not have an Internet connection, you will receive the following output after having entered a six-digit code: + +``` +Call to Keycloak failed with code 000 and message + +``` + +It will be followed by an empty line and you will be returned to your command prompt. + +To resolve this issue, please connect to the Internet and try to activate the RC file again. If you are certain that you have Internet connection, it could mean that CloudFerro Cloud account service is down. If no downtime was announced for it, please contact CloudFerro Cloud customer support: [Helpdesk and Support](Help-Desk-And-Support.html) + +### Non-2FA accounts: entering a wrong password[](#non-2fa-accounts-entering-a-wrong-password "Permalink to this headline") + +If your account does not have two-factor authentication and you entered a wrong password, you will **not** get an error. However, if you try to execute a command like **openstack flavor list**, you will get the error similar to this: + +``` +The request you have made requires authentication. (HTTP 401) (Request-ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) + +``` + +Instead of **x** characters, you will see a string of characters. + +To resolve, activate your file again and enter the correct password. + +### Using the wrong file[](#using-the-wrong-file "Permalink to this headline") + +If you have a 2FA authentication enabled for your account but have tried to activate the non-2FA version of the RC file, executing, say, command **openstack flavor list**, will give you the following error: + +``` +Unrecognized schema in response body. (HTTP 401) + +``` + +If that is the case, download the correct file if needed and use it. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +With the appropriate version of RC file activated, you should be able to create and use + +> * instances, +> * volumes, +> * networks, +> * Kubernetes clusters + +and, in general, use all OpenStack CLI commands. + +For example, if you want to create a new virtual machine, you can follow this article: + +[How to create a VM using the OpenStack CLI client on CloudFerro Cloud cloud](../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html) + +If you want your new virtual machine to be based on an image which is not available on CloudFerro Cloud cloud, you will need to upload it. The following article contains instructions how to do it: + +[How to upload your custom image using OpenStack CLI on CloudFerro Cloud](../cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/accountmanagement/How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html.md b/docs/accountmanagement/How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e05b133 --- /dev/null +++ b/docs/accountmanagement/How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html.md @@ -0,0 +1,127 @@ +How to buy credits using Pay Per Use wallet on CloudFerro Cloud[](#how-to-buy-credits-using-pay-per-use-wallet-on-brand-name "Permalink to this headline") +=========================================================================================================================================================== + +In this article you will learn how to use PPU (Pay Per Use) wallet in order to cover expenses of your account at CloudFerro Cloud. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Check for the correct tax ID or VAT number +> * Select PPU as your way of payment +> * Define how many credits for PPU service +> * Choose payment method +> * Check payment reports + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Have payment details ready** + +You can pay either through bank transfer or through [Stripe](https://stripe.com/), in which case you can use your credit cards and other means of online payment. Be sure to have the payment information ready before you start the payment process. + +Transactions over 10,000 Euros must be made using a bank transfer. + +You are going to pay with the data you enter for the organization. Be sure that you have the correct tax ID or VAT number and ready to enter, if needed. + +No. 3 **Useful articles** + +As explained in [Wallets and Contracts Management](Contracts-Wallets.html), there are **three ways of paying for the services** on CloudFerro Cloud platform: + +PPUSE (Pay Per Use Wallet) +: Billing according to the usage. + +PAYG (Pay As You Go Contract) +: Tenants are invoiced periodically based on actual usage. + +FIXED-TERM (Fixed Term Contract) +: Billing mode where services are bought for longer periods + +In case you have not entered **organization** data yet, see article [Adding and editing Organization](Adding-Editing-Organizations.html) + +Step 1 Check for the correct tax ID or VAT number[](#step-1-check-for-the-correct-tax-id-or-vat-number "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------- + +Field **Company tax ID / VAT number** must be filled in with correct data. + +![cloudferro_cloud_1.png](../_images/cloudferro_cloud_1.png) + +You can check it by going to: + +Without it, you won’t be able to make an order. An error like this one will appear: + +![cloudferro_cloud_11.png](../_images/cloudferro_cloud_11.png) + +Step 2 Select PPU as your way of payment[](#step-2-select-ppu-as-your-way-of-payment "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +On this link, you choose the actual contract type: + +![cloudferro_cloud_2.png](../_images/cloudferro_cloud_2.png) + +Click on **Buy now** (assuming you will choose Pay Per Use), otherwise, click on **Choose Fixed term** to opt for **Fixed term payments**. + +Step 3 Define how many credits for PPU service[](#step-3-define-how-many-credits-for-ppu-service "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +Either by clicking button **Buy now** or by visiting the following link directly: , you will start the process of paying for PPU. + +![cloudferro_cloud_3.png](../_images/cloudferro_cloud_3.png) + +Let’s say that you want to buy for 250 units, where each unit costs 1 Euro. + +![cloudferro_cloud_5.png](../_images/cloudferro_cloud_5.png) + +If you have only one wallet, the **default wallet** will be automatically offered. If you, however, have several wallets, choose the proper one for this order. + +Step 4 Choose payment method[](#step-4-choose-payment-method "Permalink to this headline") +------------------------------------------------------------------------------------------- + +Check whether the information about your organization is correct and proceed to payment. + +![cloudferro_cloud_6.png](../_images/cloudferro_cloud_6.png) + +There are two different ways of payment: + +Direct Bank Transfer +: This method is not instant and will take some time to fund your account. + +Stripe +: Stripe is a well established payment processor. It is completely secure and gives you the possibility to fund your account with a variety of payment methods, including credit cards. + +Again, transactions over 10,000 Euros must be made using a bank transfer. + +You will see a summary with a new invoice on the bottom of the page. + +If you chose direct bank transfer, scroll down to the payment section and click Pay: + +![cloudferro_cloud_7.png](../_images/cloudferro_cloud_7.png) + +Step 5 Check payment reports[](#step-5-check-payment-reports "Permalink to this headline") +------------------------------------------------------------------------------------------- + +Check whether the invoice amount matches the actual balance. The invoice in the upper right corner next to the eye icon marked with red line. + +![cloudferro_cloud_9.png](../_images/cloudferro_cloud_9.png) + +Check on status of the invoice by going to this link: + +![cloudferro_cloud_8.png](../_images/cloudferro_cloud_8.png) + +Check your wallet as well: + +![cloudferro_cloud_10.png](../_images/cloudferro_cloud_10.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +There are two ways of reaching to us in case of any problems: + +Dashboard ticket +: From the browser, use link or click on option **Support** –> **Tickets** in the Dashboard. + +Standard CloudFerro Cloud support +: The link is \ No newline at end of file diff --git a/docs/accountmanagement/How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html.md b/docs/accountmanagement/How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..cb90274 --- /dev/null +++ b/docs/accountmanagement/How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html.md @@ -0,0 +1,24 @@ +How to manage TOTP authentication on CloudFerro Cloud[](#how-to-manage-totp-authentication-on-brand-name "Permalink to this headline") +======================================================================================================================================= + +In order to use your CloudFerro Cloud account, you need to set a password, and an additional factor of authentication. For the latter, the TOTP algorithm is being used. In this article you will learn how to manage your TOTP configuration. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +* Important information about TOTP +* Entering the TOTP management console +* Removing the TOTP secret key +* Adding a new TOTP secret key +* Contacting customer support + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud account: + +No. 2 **2FA set on your account** + +During account initialization, you will be prompted to configure 2FA TOTP software. You can, for instance, use one of the following articles for that purpose: \ No newline at end of file diff --git a/docs/accountmanagement/How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html.md b/docs/accountmanagement/How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..aa38051 --- /dev/null +++ b/docs/accountmanagement/How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html.md @@ -0,0 +1,58 @@ +How to start using dashboard services on CloudFerro Cloud[](#how-to-start-using-dashboard-services-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +When you try to use CloudFerro Cloud dashboard at , you will see an advice on the order of operations to start using the dashboard properly. + +![dashboard-services-2-cloudferro-cloud.png](../_images/dashboard-services-2-cloudferro-cloud.png) + +Step 1 Set up the organization[](#step-1-set-up-the-organization "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +1. Go to the organization, add it by providing the name, details and a valid EU VAT number/TAX ID assigned to your country. + +The option to use is **Configuration** -> **Organization**. + +![dashboard-services-4-cloudferro-cloud.png](../_images/dashboard-services-4-cloudferro-cloud.png) + +See article [Adding and editing Organization](Adding-Editing-Organizations.html). + +Step 2 Enable payment options[](#step-2-enable-payment-options "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Go to the [eCommerce site](https://ecommerce.cloudferro.com/) and top up your wallet with the required funds. + +![dashboard-services-3-cloudferro-cloud.png](../_images/dashboard-services-3-cloudferro-cloud.png) + +See article [How to buy credits using Pay Per Use wallet on CloudFerro Cloud](How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html). + +Step 3 Activate the project[](#step-3-activate-the-project "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Go to “Cloud projects” and activate the project in the cloud/region you are interested in. The options to choose are **Billing and Reporting** -> **Cloud projects/Wallets**. + +![dashboard-services-5-cloudferro-cloud.png](../_images/dashboard-services-5-cloudferro-cloud.png) + +At the moment of this writing, there were four different regions to choose from: WAW3-1, WAW3-2, WAW4-1, FRA1-2. These regions are actually clouds running under OpenStack and in each you can have your own virtual machines, access to EO data, create Kubernetes clusters and so on. Although all clouds are running under OpenStack, there are differences in available software, hardware, resources and so on, so it pays to learn which cloud is best for you. + +You may want to work with all these clouds at the same time, maybe with different groups of people working on different projects and so on. + +It is up to you to activate all these clouds at once… or just one… or anything in between. The regions/clouds you activate in the dashboard can be seen in the Horizon dashboard, in the menu. + +Step 4 Start using the chosen cloud in Horizon[](#step-4-start-using-the-chosen-cloud-in-horizon "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +To start using the services, choose proper **Cloud Panel** from the **Management Interfaces**. + +![dashboard-services-6-cloudferro-cloud.png](../_images/dashboard-services-6-cloudferro-cloud.png) + +It will lead you to page : + +![dashboard-services-7-cloudferro-cloud.png](../_images/dashboard-services-7-cloudferro-cloud.png) + +Let’s say we want to work with cloud WAW3-1. + +![dashboard-services-10-cloudferro-cloud.png](../_images/dashboard-services-10-cloudferro-cloud.png) + +Click on **Sign In** and the Horizon will show up. Horizon will remember which project and cloud were active previously and will return to them automatically. If you want to work with another cloud, select it manually. + +![dashboard-services-9-cloudferro-cloud.png](../_images/dashboard-services-9-cloudferro-cloud.png) \ No newline at end of file diff --git a/docs/accountmanagement/Inviting-New-User.html.md b/docs/accountmanagement/Inviting-New-User.html.md new file mode 100644 index 0000000..9535e3c --- /dev/null +++ b/docs/accountmanagement/Inviting-New-User.html.md @@ -0,0 +1,27 @@ +Inviting new user to your Organization[](#inviting-new-user-to-your-organization "Permalink to this headline") +=============================================================================================================== + +Important + +One user can only be assigned to one organization at a time. + +To invite a new user to your organization you need to share an **invitation code**. + +After logging into press **Invitations** button on the left bar menu. + +![inv_01_cloudferrocloud.png](../_images/inv_01_cloudferrocloud.png) + +Now you can copy an invitation code by clicking on **Copy to clipboard** button and send it to a new user by email. + +After receiving the code, the user will join the organization by + +> * clicking **Join an Organization** in **Organization** tab and +> * pasting the invitation code. + +As an organization admin, you need to accept the invitation first. + +Go to the **Invitations** tab and choose an invitation that you want to accept or – in other case – reject. + +![inv_02_cloudferrocloud.png](../_images/inv_02_cloudferrocloud.png) + +After accepting the invitation you will be able to add/edit roles. For more details please check [Tenant manager users and roles on CloudFerro Cloud](Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/accountmanagement/Privacy-Policy.html.md b/docs/accountmanagement/Privacy-Policy.html.md new file mode 100644 index 0000000..8d8e3a0 --- /dev/null +++ b/docs/accountmanagement/Privacy-Policy.html.md @@ -0,0 +1,4 @@ +Privacy policy for clients[](#privacy-policy-for-clients "Permalink to this headline") +======================================================================================= + +If you are not redirected, [click here](https://cloudferro.com/cloudferro-privacy-policy-for-clients/). \ No newline at end of file diff --git a/docs/accountmanagement/Registration-And-Account.html.md b/docs/accountmanagement/Registration-And-Account.html.md new file mode 100644 index 0000000..3c3574a --- /dev/null +++ b/docs/accountmanagement/Registration-And-Account.html.md @@ -0,0 +1,28 @@ +Registration and Setting up an Account[](#registration-and-setting-up-an-account "Permalink to this headline") +=============================================================================================================== + +Go to the site and press **CREATE ACCOUNT** button. + +![register_cloudferrocloud.png](../_images/register_cloudferrocloud.png) + +Fill up all fields marked with **\*** including accepting mandatory terms and conditions and press **Create Account** button. + +Please note that marketing consents are not mandatory and can be changed at any time. + +![create_account_cloudferrocloud.png](../_images/create_account_cloudferrocloud.png) + +Once you create account below screen will appear. Please check your mail box and verify mail. After that you will be able to log in. + +![registration_successful_cloudferrocloud.png](../_images/registration_successful_cloudferrocloud.png) + +For general information about types of account and user roles you may have in Dashboard, see [Tenant manager users and roles on CloudFerro Cloud](Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html.md) + +After creating personal account you can either create new company account or join an existing account. See articles: + +[Adding and editing Organization](Adding-Editing-Organizations.html) + +[Inviting new user to your Organization](Inviting-New-User.html) + +If you are a single user you can only access a limited number of services. + +See article [How to start using dashboard services on CloudFerro Cloud](How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/accountmanagement/Removing-User-From-Organization.html.md b/docs/accountmanagement/Removing-User-From-Organization.html.md new file mode 100644 index 0000000..db924f3 --- /dev/null +++ b/docs/accountmanagement/Removing-User-From-Organization.html.md @@ -0,0 +1,10 @@ +Removing user from Organization[](#removing-user-from-organization "Permalink to this headline") +================================================================================================= + +After logging into press **Sub-accounts** button on the left bar menu to check the list of members of your Organization. + +![users_roles_01_cloudferrocloud.png](../_images/users_roles_01_cloudferrocloud.png) + +Select user that you want to be removed and press **Unassign** button on the right side and after that press **Confirm** button. + +User will have received notification about removing from your Organization. \ No newline at end of file diff --git a/docs/accountmanagement/Services.html.md b/docs/accountmanagement/Services.html.md new file mode 100644 index 0000000..fe36607 --- /dev/null +++ b/docs/accountmanagement/Services.html.md @@ -0,0 +1,21 @@ +Services[](#services "Permalink to this headline") +=================================================== + +After logging into press **Active services** button on the left bar menu. + +![services_cloudferrocloud.png](../_images/services_cloudferrocloud.png) + +In this tab you are able to filter your services by Project or by Product. + +You can also check what type of contract or billing mode is assigned to your services. For more details please visit /accountmanagement/Accounts-and-Projects-Management. + +How to change assigned contract[](#how-to-change-assigned-contract "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +**PAY PER USE** - user can assign wallet to specific project in the **Accounts** tab + +**PAY AS YOU GO** - user can assign wallet to specific project in the **Accounts** tab + +**FIXED TERM** - is assigned by CloudFerro Support Team during the contract creation + +Please note that **PPU/PAYG** assignment status is visible in the **Accounts** tab. \ No newline at end of file diff --git a/docs/accountmanagement/Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html.md b/docs/accountmanagement/Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..8e30fa4 --- /dev/null +++ b/docs/accountmanagement/Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html.md @@ -0,0 +1,72 @@ +Tenant manager users and roles on CloudFerro Cloud[](#tenant-manager-users-and-roles-on-cloudferro-cloud "Permalink to this headline")enant manager users and roles on CloudFerro Cloud[](#tenant-manager-users-and-roles-on-brand-name "Permalink to this headline") +================================================================================================================================= + +Differences between OpenStack User Roles and Tenant Manager’s Roles[](#differences-between-openstack-user-roles-and-tenant-manager-s-roles "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +An OpenStack role is a personality that a user assumes to perform a specific set of operations. A role includes a set of rights and privileges. A user assuming that role inherits those rights and privileges. OpenStack roles are defined for each user and each project independently. + +A Tenant Manager role, on the other hand, defines whether a user should have the ability to manage an organization via the Tenant Manager or have access to OpenStack. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * The difference between User Roles and Tenant Manager Role +> * List three basic roles an organization administrator you can assign +> * Show how to add a **member+** role, which can have access to OpenStack and be used for managing projects + +Users and Roles in the Tenant Manager[](#users-and-roles-in-the-tenant-manager "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +After logging into click on the **Sub-accounts** button on the left bar menu. + +![Tenant_manager_01_cloudferro.png](../_images/Tenant_manager_01_cloudferro.png) + +Here you are able to: + +> * Check your organizations’ list of users and their roles +> * Remove users from or add them to your organization (admin role) + +As an *organization administrator* you can assign one of the following roles to a user: + +> * **admin** - user with highest privileges, can manage whole organizations and has access to OpenStack. +> * **member** - default user with basic privileges. +> * **member+** - the same as **member** but has OpenStack access and can manage projects. + +Adding member+ user to your project in OpenStack using Horizon interface[](#adding-member-user-to-your-project-in-openstack-using-horizon-interface "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Users with the role of **member+** have access to OpenStack and can be enabled to manage your organization projects. They cannot however, manage the organization itself. + +To add a **member+** user to the project, follow these steps: + +**1.** Check if your user has a **member+** role in Tenant Manager. + +**2.** Log into as an admin. + +**3.** Select **Identity** → **Projects** + +![Tenant_manager_02_cloudferro.png](../_images/Tenant_manager_02_cloudferro.png) + +**4.** Select the project you want to add a user to and select **Manage members** + +![Tenant_manager_03_cloudferro.png](../_images/Tenant_manager_03_cloudferro.png) + +**5.** Add the desired user(s) to the project by clicking on the “+” button next to them. + +![Tenant_manager_04_cloudferro.png](../_images/Tenant_manager_04_cloudferro.png) + +**6.** Choose a suitable project role for the user and confirm by clicking **Save** in the lower-right corner. + +![Tenant_manager_05_cloudferro.png](../_images/Tenant_manager_05_cloudferro.png) + +**7.** Next time the user will log into OpenStack Horizon, the suitable access to the project will be granted. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +The article [Inviting new user to your Organization](Inviting-New-User.html) shows how to invite a new user. + +To the contrary, article [Removing user from Organization](Removing-User-From-Organization.html) shows how to remove a user from the organization. + +The article /accountmanagement/Accounts-and-Projects-Management is a general guidance to creating and managing accounts and projects on CloudFerro Cloud. \ No newline at end of file diff --git a/docs/accountmanagement/Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html.md b/docs/accountmanagement/Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html.md new file mode 100644 index 0000000..abca923 --- /dev/null +++ b/docs/accountmanagement/Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html.md @@ -0,0 +1,209 @@ +Two-Factor Authentication to CloudFerro Cloud site using mobile application[](#two-factor-authentication-to-brand-name-site-using-mobile-application "Permalink to this headline") +=================================================================================================================================================================================== + +Warning + +Two-Factor Authentication is required for all CloudFerro Cloud users. The only exception are accounts which log in using Keystone credentials. + +Traditionally, the most basic way to implement security online was to authenticate users and companies with a pair of usernames/passwords. Most usernames are email addresses and if email address is breached, the bad actor can probably learn your password too. What once used to be secure enough is not secure now because of easy access to refined brute force methods, availability of computing power at scale, social engineering methods, identity theft and so on. + +The way to overcome this limitation is to introduce two or more factors or types of user authentication. These could be + +> * something the user knows (email address, the name of their first pet etc.) +> * something the user has (token generator, smartphone, credit card etc.) or +> * biometric information such as fingerprint, iris, retina, voice, face and so on. + +Logging into the CloudFerro Cloud site uses two-factor authentication, meaning you will have to supply two independent types of data: + +> * the “classical” username and password, as well as +> * the numeric code supplied by a concrete mobile app. + +This article is about using mobile devices to authenticate to the cloud. If you want to use your computer to do that, see [Two-Factor Authentication to CloudFerro Cloud site using KeePassXC on desktop](Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html). + +You will first have to install one of the following two mobile applications, for Android or iOS mobile operating systems: + +> * [FreeOTP](https://freeotp.github.io/), where OTP stands for One Time Password, or +> * [Google Authenticator](https://googleauthenticator.net/). + +We can use “mobile authenticator” as a generic term for a mobile app that can help authenticate with the account. + +Which One to Use – FreeOTP or Google Authenticator?[](#which-one-to-use-freeotp-or-google-authenticator "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +You can use FreeOTP with Google accounts instead of Google Authenticator app. + +If you already use Google Authenticator app for other accounts, you may prefer it over FreeOTP. + +Warning + +If your accounts are protected by Google Authenticator and it stops working, then you risk losing **all** the data that were behind those protected accounts. The most common scenario is to switch to a new phone number and then not be able to verify the accounts via a text message to the previous phone number. + +In this tutorial, you are going to use the FreeOTP app. + +Warning + +If you lose access to QR codes and cannot log into the Horizon site for CloudFerro Cloud, ask Support service to help you by sending email to the following address [support@cloudferro.com](/cdn-cgi/l/email-protection#80f3f5f0f0eff2f4a6a3b3b7bba6a3b5b2bba6a3b4b8bbe3eceff5e4e6e5f2f2efa6a3b4b6bbe3efed). + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to start using the mobile authenticator +> * How to locate, download and install FreeOTP app on your mobile device +> * How to set up FreeOTP app and connect it to your CloudFerro Cloud account +> * How to get new code each time you want to enter the site + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +Use only one of the four possible combinations for two apps and two app stores. + +No. 1 **FreeOTP app in Google Play Store** + +Download [FreeOTP app in Google Play Store using this link](https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp). + +No. 2 **FreeOTP app in iOS App Store** + +Download [FreeOTP app in iOS App Store using this link](https://apps.apple.com/la/app/freeotp-authenticator/id872559395). + +No. 3 **Google Authenticator in Google Play Store** + +Download [Google Authenticator in Google Play Store using this link](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en&gl=US). + +No. 4 **Google Authenticator in iOS App Store** + +Download [Google Authenticator in iOS App Store using this link](https://apps.apple.com/us/app/google-authenticator/id388497605). + +Warning + +You should install the authenticator app **before** trying to log into the CloudFerro Cloud site. + +You are now going to download, install and use the FreeOTP app to authenticate to CloudFerro Cloud site. + +Step 1 Download and Install FreeOTP from the App Store[](#step-1-download-and-install-freeotp-from-the-app-store "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------- + +Using the App Store icon from the desktop of your iOS device, locate app called **freeotp**. A screen like this will appear: + +[![otp01.png](../_images/otp01.png)](../_images/otp01.png) + +Tap on GET and the app will start downloading to your device. + +[![otp02.png](../_images/otp02.png)](../_images/otp02.png) + +It may take a minute or so and then install it by tapping on button Install. + +[![otp03.png](../_images/otp03.png)](../_images/otp03.png) + +Once installed, type on **Open** and the app will run. At first, there will be no tokens to work with: + +[![otp04.png](../_images/otp04.png)](../_images/otp04.png) + +Note + +FreeOTP can also use tokens to secure access to the remote site. The CloudFerro Cloud site uses QR code, so that is what you will use in this tutorial. (Both “token” and “QR scan” denote a secure connection to the site, but use different techniques in the process.) + +Step 2 Scan QR and Create Brand[](#step-2-scan-qr-and-create-brand "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Select a brand, which means select an icon that will make your tokens stand out graphically. If you will employ this app only to get access to CloudFerro Cloud, you may select whichever icon you want. + +[![otp05.png](../_images/otp05.png)](../_images/otp05.png) + +In the next step, you may require that the phone is unlocked when the token is to be activated. Choose that if you are afraid someone might steal your phone and get access to your CloudFerro Cloud data that way. + +[![otp07.png](../_images/otp07.png)](../_images/otp07.png) + +Clicking on **information** icon will show you legal details about this app. + +[![otp08.png](../_images/otp08.png)](../_images/otp08.png) + +To scan the QR code, use a QR like icon in the upper part of the screen, like this: + +![eefa_freeotp_qr_icon.png](../_images/eefa_freeotp_qr_icon.png) + +Click on it to get to the scanner part of the application and read the QR code from the login screen. + +Note + +The QR code will appear on screen when you first try to log into the CloudFerro Cloud site (see below). + +[![eefa_qr_screen_creodias.png](../_images/eefa_qr_screen_creodias.png)](../_images/eefa_qr_screen_creodias.png) + +Step 3 Create a Six-digit Code to Enter Into the Login Screen[](#step-3-create-a-six-digit-code-to-enter-into-the-login-screen "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Finally, you will see a row within the FreeOTP app, with the icon you chose and with the code that will appear automatically. For instance, the code is **289582** and that is the code that you need to enter when the site asks you for *One-time code*. + +[![otp09.png](../_images/otp09.png)](../_images/otp09.png) + +If you created several tokens or repeatedly scanned QR code from the screen, you may see the appropriate number of rows on the mobile screen: + +[![eefa_several_rows.png](../_images/eefa_several_rows.png)](../_images/eefa_several_rows.png) + +Tapping on any of these will produce the six-digit code that you have to type into the entry form to get logged in. Only one of these will be the right one, in this case, the first row produces the correct six-digits code for CloudFerro Cloud site. + +[![eefa_tapped.png](../_images/eefa_tapped.png)](../_images/eefa_tapped.png) + +You are now ready to log into the CloudFerro Cloud site using the two-factor authentication. + +How to Start Using the Mobile Authenticator With Your Account[](#how-to-start-using-the-mobile-authenticator-with-your-account "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Use the usual link to log into your CloudFerro Cloud account and choose CloudFerro Cloud in the input menu. + +[![eefa_start_creodias.png](../_images/eefa_start_creodias.png)](../_images/eefa_start_creodias.png) + +Click on blue button Sign In and enter your username / email and password: + +[![eefa_sign_regular_creodias.png](../_images/eefa_sign_regular_creodias.png)](../_images/eefa_sign_regular_creodias.png) + +If the data you entered has not already been linked to two-factor authentication, the next screen will be **Mobile Authenticator Setup**: + +[![eefa_mobile_auth_setup_creodias.png](../_images/eefa_mobile_auth_setup_creodias.png)](../_images/eefa_mobile_auth_setup_creodias.png) + +This screen will contain the QR code that you have to read from using the mobile authenticator app, in this case, the FreeOTP app. + +At this moment, start using the mobile device – activate the FreeOTP first if not already active, scan the QR code with the QR icon and, as explained above, get the six-digit code on the mobile device screen. + +Retype that six-digit code into the **One-time code** field on computer screen. It is denoted by an asterisk, meaning that it is mandatory to enter a value into this field. + +You can use the field **Device Name** to remind yourself on which device was the mobile authenticator app installed on. + +Click on **Submit** and you will be brought back to the **Sign in** screen from the beginning: + +Logging Into the Site Once the Two-Factor Authentication is Installed[](#logging-into-the-site-once-the-two-factor-authentication-is-installed "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Here is the workflow in one place, with all of the screens repeated for easy reference. + +Use the usual link to log into your CloudFerro Cloud account and choose CloudFerro Cloud in the input menu. + +[![eefa_start_creodias.png](../_images/eefa_start_creodias.png)](../_images/eefa_start_creodias.png) + +Click on blue button **Sign In** and enter your username / email and password: + +[![eefa_sign_regular_creodias.png](../_images/eefa_sign_regular_creodias.png)](../_images/eefa_sign_regular_creodias.png) + +Since the two-factor authentication is already installed, you will only see the window to enter the six-digit code. + +[![eefa_restart_login_creodias.png](../_images/eefa_restart_login_creodias.png)](../_images/eefa_restart_login_creodias.png) + +Now activate the mobile authenticator app and get the code on the device screen, for instance, like this: + +[![eefa_tapped.png](../_images/eefa_tapped.png)](../_images/eefa_tapped.png) + +In this case, the code is 828966. Enter it into the form, **Submit** and you will be logged in. + +[![eefa_logged_in_creodias.png](../_images/eefa_logged_in_creodias.png)](../_images/eefa_logged_in_creodias.png) + +Note + +If the FreeOTP app is in the foreground on the mobile device while you are submitting the username and password, the app will react automatically and the proper six-digit code will appear on its own on the authenticator device. + +### What To Do Next[](#what-to-do-next "Permalink to this headline") + +As mentioned in the beginning, you can use your computer for two-factor authentication – see article [Two-Factor Authentication to CloudFerro Cloud site using KeePassXC on desktop](Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html). + +Either using mobile device or computer to authenticate, you will be logged into Horizon. You will then need to activate access to CloudFerro Cloud cloud API functions and be able to run **openstack** command. Please see article [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html). + +To learn how to manage your TOTP secret key, visit the following article: [How to manage TOTP authentication on CloudFerro Cloud](How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html) - it can be useful if you, for instance, want to use a different method of authentication, are unable to extract your secret key from currently used piece of software such as FreeOTP and do not have your secret key backed up in a readable way. \ No newline at end of file diff --git a/docs/accountmanagement/Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html.md b/docs/accountmanagement/Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..d1e5e69 --- /dev/null +++ b/docs/accountmanagement/Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html.md @@ -0,0 +1,136 @@ +Two-Factor Authentication to CloudFerro Cloud site using KeePassXC on desktop[](#two-factor-authentication-to-brand-name-site-using-keepassxc-on-desktop "Permalink to this headline") +======================================================================================================================================================================================= + +Please see article [Two-Factor Authentication to CloudFerro Cloud site using mobile application](Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html) if you want to use a smartphone app for the TOTP two-factor authentication. + +If you, however, want to use your desktop or laptop computer instead, KeePassXC is probably a good choice for you. It is a free and open source graphical password manager. It stores passwords, TOTP keys and other secrets in a file on your computer. You can later, for example, move that file manually to a different computer to use that device instead of the current one. + +Contrary to software such as BitWarden, 1Password or LastPass, KeePassXC does not have any cloud sync features. + +Attention + +Since KeePassXC does not provide any cloud storage, you need to make sure that you do not lose your file and whatever is required to decrypt it. You will lose all the content of the file if you lose any of these objects. The backup of this file should be performed. + +If you already have KeePassXC installed and configured, skip to Step 3 Adding Entry or 4 Configuring the TOTP. + +The following instructions are for Ubuntu. If you use a different operating system, please [refer to the appropriate documentation](https://keepassxc.org/download/). + +Step 1 Install KeePassXC[](#step-1-install-keepassxc "Permalink to this headline") +----------------------------------------------------------------------------------- + +Install KeePassXC before logging in to the CloudFerro Cloud website. Open the terminal, type the following command and press Enter: + +``` +sudo apt update && sudo apt upgrade -y && sudo apt install -y keepassxc + +``` + +Step 2 Configure KeePassXC[](#step-2-configure-keepassxc "Permalink to this headline") +--------------------------------------------------------------------------------------- + +Launch KeePassXC. During its first run, you will see the following window: + +![keepassxc_01_creodias.png](../_images/keepassxc_01_creodias.png) + +Click the button **Create new database** it in order to create a file in which you can store your passwords, TOTP keys and other secrets. Now you will see the following window: + +![keepassxc_02_creodias.png](../_images/keepassxc_02_creodias.png) + +In the first step of database creation you may provide its name and discription. The name provided here will not be the name of your file, so you may leave it as it is. Click **Continue**. The following window will appear: + +![keepassxc_03_creodias.png](../_images/keepassxc_03_creodias.png) + +Next, you may choose how long should the decryption of your database take. However, please keep in mind that, as it is written in that window, **Higher values offer more protection, but opening the database will take longer**. Leave the default database format and click **Continue**. You will now see the following window: + +![keepassxc_04_creodias.png](../_images/keepassxc_04_creodias.png) + +Now you need to provide the password for decrypting your database. Enter it again in the second text field. You can also add additional security measures using the button **Add additional protection…**, but if you are just getting started in might not be needed. + +Attention + +If at any point in the future you are unable to provide your password (for example, because you have forgotten it) and any additional protection measures you configured, you will be locked out of your database and potentially lose all of its content. + +Click **Done**. + +Choose the name for the file containing your secrets and its location. Click **Save**. + +Step 3 Add the entry for your account[](#step-3-add-the-entry-for-your-account "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +Your database should now be operational. Let’s create the entry containing your username, password and TOTP for the CloudFerro Cloud cloud. Click **Add a new entry** (the fourth button on the toolbar, marked with the red rectangle on the screenshot below. + +![keepassxc_05_creodias.png](../_images/keepassxc_05_creodias.png) + +The following window will appear: + +![keepassxc_06_creodias.png](../_images/keepassxc_06_creodias.png) + +In the **Title** field enter the name under which your entry should be identified in your database, for example CloudFerro Cloud. Then, type your username and password. + +Click **OK** to save the entry. + +If the option **Automatically save after every change** in the **General** section of the application settings is enabled, you do not have to save. If not, press CTRL+S to save the database. + +Step 4 Configure TOTP[](#step-4-configure-totp "Permalink to this headline") +----------------------------------------------------------------------------- + +Now we need to obtain your TOTP key. + +### Method 1: During account creation[](#method-1-during-account-creation "Permalink to this headline") + +After having created an account on but before first login, you will receive the **Mobile Authenticator Setup** prompt, as in the following image: + +![keepassxc_07_creodias.png](../_images/keepassxc_07_creodias.png) + +Since you are using a computer which cannot act as a mobile device, click **Unable to scan?**. The QR code will now be replaced with your key: + +![keepassxc_08_creodias.png](../_images/keepassxc_08_creodias.png) + +Copy the code with which the QR code has just been replaced. + +Once you have your TOTP key, + +> * return to KeePassXC, +> * right-click the entry for your account and +> * choose the **TOTP… -> Setup TOTP…** option. + +You will see the following window: + +![keepassxc_09_creodias.png](../_images/keepassxc_09_creodias.png) + +Paste your key there into the text field **Key:** and keep the checkbox **Default RFC 6238 token settings** checked. Click **OK**. + +In order to view your code, right-click the entry and select **TOTP… > Show TOTP…**. It is easier, however, to simply + +> * left-click that entry and +> * press CTRL+Shift+T. + +You can also press CTRL+T while your entry is highlighted to copy your TOTP code to your clipboard (remember that depending on settings it will disappear from your clipboard, so make sure that you paste it in time). + +The window with the code will look like this: + +![keepassxc_10_creodias.png](../_images/keepassxc_10_creodias.png) + +Type your 6-digit code from the above window to the text field **One-time-code** on the CloudFerro Cloud website and choose how you would like to call your device containing the TOTP key. Please make sure that you do it before that key expires. If the key expires, you will get another one and you should type it instead. Click **Submit**. You should now be able to proceed with your login process. + +### Method 2: After another method of TOTP has already been configured[](#method-2-after-another-method-of-totp-has-already-been-configured "Permalink to this headline") + +If the method of TOTP authentication you are currently using allows you to extract the **secret** key(or you have it backed up somewhere), you should be able to use that same **secret key** which you are currently using for KeePassXC as well. + +If no other options remain, contact CloudFerro Cloud customer support for assistance. + +Either way, eventually you should get your secret key. Enter it in KeePassXC the same way as explained in **Method 1** above - to the **Key:** text field. If that secret key is already added and configured for your account, no further action should be necessary. If not and you are in the process of configuring it, paste the 6-digit TOTP code from KeePassXC in the same way as you entered the code from your other device during account setup. + +Step 5 Login using TOTP[](#step-5-login-using-totp "Permalink to this headline") +--------------------------------------------------------------------------------- + +Each time you login, type your credentials normally. After that you will see the following text field: + +![keepassxc_11_creodias.png](../_images/keepassxc_11_creodias.png) + +Generate your TOTP code as explained before (left-click the appropriate entry in KeePassXC and press CTRL+Shift+T) and type that code in the text field **One-time code** in your browser. If you want to simply copy your code to your clipboard, press CTRL+T while your entry is highlighted (remember that depending on settings it will disappear from your clipboard, so make sure that you paste it in time). Each code lasts only 30 seconds, so if you only have a few seconds remaining on your current code, you might want to wait until the new one is generated. Now you should be signed in. + +Additional information[](#additional-information "Permalink to this headline") +------------------------------------------------------------------------------- + +You can find additional information about using KeePassXC in its [official documentation](https://keepassxc.org/docs/). \ No newline at end of file diff --git a/docs/accountmanagement/accountmanagement.html.md b/docs/accountmanagement/accountmanagement.html.md new file mode 100644 index 0000000..862226f --- /dev/null +++ b/docs/accountmanagement/accountmanagement.html.md @@ -0,0 +1,21 @@ +ACCOUNT MANAGEMENT[](#account-management "Permalink to this headline") +======================================================================= + +* [Registration and Setting up an Account](Registration-And-Account.html.md) +* [How to start using dashboard services on CloudFerro Cloud](How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html.md) +* [Two-Factor Authentication to CloudFerro Cloud site using mobile application](Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html.md) +* [Two-Factor Authentication to CloudFerro Cloud site using KeePassXC on desktop](Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html.md) +* [How to activate OpenStack CLI access to CloudFerro Cloud](How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html.md) +* [How to manage TOTP authentication on CloudFerro Cloud](How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html.md) +* [Adding and editing Organization](Adding-Editing-Organizations.html.md) +* [How to buy credits using Pay Per Use wallet on CloudFerro Cloud](How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html.md) +* [Forgotten Password](Forgotten-Password.html.md) +* [Editing profile](Editing-Profile.html.md) +* [Wallets and Contracts Management](Contracts-Wallets.html.md) +* [Services](Services.html.md) +* [Inviting new user to your Organization](Inviting-New-User.html.md) +* [Removing user from Organization](Removing-User-From-Organization.html.md) +* [Tenant manager users and roles on CloudFerro Cloud](Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html.md) +* [Cookie consent on CloudFerro Cloud](Cookie-consent-on-CloudFerro-Cloud.html.md) +* [Help Desk and Support](Help-Desk-And-Support.html.md) +* [Privacy Policy](Privacy-Policy.html.md) \ No newline at end of file diff --git a/docs/cloud/Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html.md b/docs/cloud/Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b233bf0 --- /dev/null +++ b/docs/cloud/Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html.md @@ -0,0 +1,28 @@ +Block storage and object storage performance limits on CloudFerro Cloud[](#block-storage-and-object-storage-performance-limits-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================== + +On CloudFerro Cloud, there are performance limits for **HDD**, **NVMe (SSD)**, and **Object Storage** to ensure stable operation and protect against accidental DDoS attacks. + +Current limits[](#current-limits "Permalink to this headline") +--------------------------------------------------------------- + +Block HDD +: **500** IOPS (read and write) + +Block SSD/NVMe +: **3000** IOPS (read and write) + + **NOTE**: On CloudFerro Cloud, *all* SSD storage is NVMe-based. + +S3 Object Storage (General Tier) +: **2000** operations per second with a + + * **2500 burst limit** per bucket and + * **150 MB/s** transfer per request + +In majority of cases, the actual throughput may be larger because: + +> * Typical downloads use **multiple requests** and +> * More than **99.95%** of requests stay below **100 MB/s**. + +Again, this limit primarily helps mitigate accidental **DDoS** scenarios. \ No newline at end of file diff --git a/docs/cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html.md b/docs/cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html.md new file mode 100644 index 0000000..841d5cc --- /dev/null +++ b/docs/cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html.md @@ -0,0 +1,262 @@ +DNS as a Service on CloudFerro Cloud Hosting[](#dns-as-a-service-on-brand-name-cloud-name-hosting "Permalink to this headline") +================================================================================================================================ + +DNS as a Service (DNSaaS) provides functionality of managing configuration of user’s domains. Managing configuration means that the user is capable of creating, updating and deleting the following DNS records: + +| | | +| --- | --- | +| Type | Description | +| A | Address record | +| AAA | IPv6 address record | +| CNAME | Canonical name record | +| MX | Mail exchange record | +| PTR | Pointer record | +| SPR | Sender Policy Framework | +| SRV | Service locator | +| SSHFP | SSH Public Key Fingerprint | +| TXT | Text record | + +DNS configuration management is available via OpenStack web dashboard (Horizon), OpenStack command line interface as well as via the API. + +DNS records management is performed on the level of an OpenStack project. + +Since DNSaaS purpose is to deal with external domain names, the internal name resolution (name resolution for private IP addresses within user’s projects) is not covered by this documentation. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Domain delegation in registrar’s system +> * Domain configuration through Zone configuration +> * Checking the presence of the domain on the Internet +> * Adding new record for the domain +> * Adding records for subdomains +> * Managing records +> * Limitations in OpenStack DNSaaS + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Must have access to a project in CloudFerro Cloud OpenStack account** + +If you are a tenant manager, you will be able to either use the existing basic project or create new projects for yourself or your users. + +If you are a user of the account, the tenant manager will have already created a project for you. + +No. 3 **Basic knowledge of DNS notions and principles** + +We assume you already have a + +> * basic knowledge of Domain Name Service principles as well as +> * understanding of the purpose of DNS records. + +If not, please see [DNS article on Wikipedia](https://en.wikipedia.org/wiki/Domain_Name_System) or [OpenStack DNSaaS command line reference](https://docs.openstack.org/python-designateclient/latest/user/shell-v2.html) + +No. 4 **Must have domain purchased from a registrar** + +You also must own a domain purchased from any registrar (domain reseller). Obtaining a domain from registrars is not covered in this article. + +No. 5 **Must have a Linux server with an assigned IP address** + +To verify DNS creation and propagation, you shall use the **dig** command from Linux. You will also need an IP address to point the domain name to. You may have already created one such VM in your CloudFerro Cloud server and if not, here is how to create a virtual machine, assign a floating IP to it and access it from Windows desktop computer: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html) + +Or, you might connect from a Linux based computer to the cloud: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +In both cases, the article will contain a section to connect floating IP to the newly created VM. The generated IP address will vary, but for the sake of concreteness we shall assume that it is **64.225.133.254**. You will enter that value later in this article, to create record set for the site or service you are making. + +Step 1 Delegate domain to your registrar’s system[](#step-1-delegate-domain-to-your-registrar-s-system "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------- + +The configuration of domain name in your registrar’s system must point to the NS records of CloudFerro name servers. It can be achieved in two ways: + +**Option 1 - Use CloudFerro name servers (recommended)** + +Configure NS records for your domain to the following CloudFerro name servers: + +| | | | +| --- | --- | --- | +| Purpose | Name Server | IP | +| primary name server | cloud-dns1.cloudferro.com | 91.212.141.94 | +| secondary name server | cloud-dns2.cloudferro.com | 91.212.141.102 | +| secondary name server | cloud-dns3.cloudferro.com | 91.212.141.86 | + +**Option 2 - Set up your own glue records (not recommended)** + +Warning + +This configuration option may be not supported by some registrars. + +Configure glue records for your domain, so that they point to the following IP addresses: + +| | | | +| --- | --- | --- | +| Purpose | Name Server | IP | +| primary name server | ns1.exampledomain.com | 91.212.141.94 | +| secondary name server | ns2.exampledomain.com | 91.212.141.102 | +| secondary name server | ns3.exampledomain.com | 91.212.141.86 | + +Step 2 Zone configuration[](#step-2-zone-configuration "Permalink to this headline") +------------------------------------------------------------------------------------- + +Zone configuration is defining parameters for the main domain name you have purchased. + +To manage domain *exampledomain.com* in OpenStack, login to OpenStack dashboard, choose the right project if different than default, go to **Project** → **DNS** → **Zones**, click **Create Zone** and fill in the required fields: + +![dns1.png](../_images/dns1.png) + +Here is what the parameters mean: + +> * **Name**: your domain name +> * **Description**: free text description +> * **Email Address**: an administrative e-mail address associated with the domain +> * **TTL**: *Time To Live* in seconds - a period of time between refreshing cache in DNS servers. Please note that the longer time, the faster will be name recognition for your domain by external DNS servers but also if you introduce changes, they will propagate slower. The default value of 3600 seconds is a reasonable compromise. +> * **Type**: You may choose if OpenStack name servers will be primary or secondary for your domain. Default: Primary. In case you want to setup secondary name servers, you just define IP addresses or master DNS servers for the domain. + +After submitting, your domain should be served by OpenStack. + +Step 3 Checking the presence of the domain on the Internet[](#step-3-checking-the-presence-of-the-domain-on-the-internet "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------- + +It usually takes from 24 up to 48 hours for the domain name to propagate through the Internet so it will **not** be available right away. Rarely, domain name starts resolving in matters of minutes and hours instead of days, so it pays to try the domain address in your browser an hour or two after configuring the zone for the domain. + +There are several ways of checking whether the domain name has propagated. + +**Domain name in the browser** +: The most natural way of checking is to enter the domain name into the browser. If you get a message that the site cannot be found, you will have to wait longer. + + Browsers, in general, do not provide messages that pinpoint to the lack of propagation as the source of error. Be sure to check in the browser again after you add records to the zone (see below). + +**Check with Linux dig command** +: The **dig** command has several parameters. The following combination will show the presence of the name servers in the global DNS system: + + > ``` + > dig -t any +noall +answer exampledomain.com @cloud-dns1.cloudferro.com + > exampledomain.com. 3600 IN SOA cloud-dns2.cloudferro.com. [email protected]. 1675003306 3588 600 86400 3600 + > exampledomain.com. 3600 IN NS cloud-dns1.cloudferro.com. + > exampledomain.com. 3600 IN NS cloud-dns3.cloudferro.com. + > exampledomain.com. 3600 IN NS cloud-dns2.cloudferro.com. + > + > ``` + +**Check with Linux curl command** +: The **curl** command will transfer data from one domain address to the host on which it is running. Here is what the output would look like for the domain name that does not exist: + +``` +curl someinvaliddomain.com +curl: (6) Could not resolve host: someinvaliddomain.com + +``` + +If the site responds via HTML that means the domain was resolved: + +``` +curl exampledomain.com + + + + ... + +``` + +**Check with sites that specialize in DNS configuration tracking** +: There are sites that will show on the map of the world whether the chosen servers on the Internet know about the domain name or not. Search in the search engine of your choice for a key phrase such as “*DNS checker propagation*”, choose a site and enter the domain name. + + Specify **A** to see the propagation of the domain itself and specify **NS** to see the propagation of nameservers across the Internet. + +Step 4 Adding new record for the domain[](#step-4-adding-new-record-for-the-domain "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +To add a new record to the domain, click on **Create Record Set** next to the domain name and fill in the required fields. The most important entry is to connect the domain name to the IP address you have. To configure an address of web server in **exampledomain.com**, so that it is resolved to **64.225.133.254** which is a Floating IP address of your server, fill the form as follows: + +![create_main_site_dns.png](../_images/create_main_site_dns.png) + +The parameters are: + +> * **Type**: Type of record (for example A, MX, etc.) +> * **Name**: name of the record (for example **www.exampledomain.com**, **mail.exampledomain.com**, …) +> * **Description**: free text description +> * **TTL**: Time To Live in seconds - a period of time between refreshing cache in DNS serves. +> * **Records**: Desired record value (there may be more than one - one per line): +> +> > + for records of Type A put IP address +> > + for records of Type MX put name of a mail server which hosts e-mails for the domain +> > + for records of Type CNAME put original name which is to be aliased + +Submit the form and check whether your configuration works: + +``` +dig -t any +noall +answer exampledomain.com @cloud-dns1.cloudferro.com +exampledomain.com. 3600 IN SOA cloud-dns2.cloudferro.com. XXXXXXXXX.YYYYYYYY.com. 1675325538 3530 600 86400 3600 +exampledomain.com. 3600 IN A 64.225.133.254 +exampledomain.com. 3600 IN NS cloud-dns1.cloudferro.com. +exampledomain.com. 3600 IN NS cloud-dns2.cloudferro.com. +exampledomain.com. 3600 IN NS cloud-dns3.cloudferro.com. + +``` + +Note + +Each time a name of domain or a server is added or edited, add dot ‘.’ at the end of the entry. +For example: **exampledomain.com.** or **mail.exampledomain.com.**. + +Step 5 Adding records for subdomains[](#step-5-adding-records-for-subdomains "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Defining subdomains is similar except that, normally, the subdomain would propagate within minutes instead of days. + +As previously, use command is **DNS** -> **Zones** -> **Record Sets**. + +To configure an address of web server in **exampledomain.com**, so that **www.exampledomain.com** is resolved to **64.225.133.254** which is a Floating IP address of your server, fill the form as follows: + +![create_www_subdomain.png](../_images/create_www_subdomain.png) + +Submit the form and check whether your configuration works: + +``` +dig -t any +noall +answer www.exampledomain.com @cloud-dns1.cloudferro.com +www.exampledomain.com. 3600 IN A 64.225.133.254 + +``` + +Step 6 Managing records[](#step-6-managing-records "Permalink to this headline") +--------------------------------------------------------------------------------- + +Anytime you want to review, edit or delete records in your domain, visit OpenStack dashboard, **Project** → **DNS** → **Zones**. After clicking the domain name of your interest, choose **Record Sets** tab and see the list of all records: + +![show_example_domain_record_sets.png](../_images/show_example_domain_record_sets.png) + +From this screen you can update or delete records. + +Limitations[](#limitations "Permalink to this headline") +--------------------------------------------------------- + +There are the following limitations in OpenStack DNSaaS: + +> * You cannot manage NS records for your domain. Therefore +> +> > + you cannot add additional secondary name servers +> > + you are unable to delegate subdomains to external servers +> * Even though you are able to configure reverse DNS for your domain, this configuration will have no effect since reverse DNS for CloudFerro Cloud IP pools are managed on DNS servers other than OpenStack DNSaaS. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Once an OpenStack object has floating IP address, you can use the DNS service to propagate a domain name and, thus, create a service or a site. There are several situations in which you can create a floating IP address: + +You already have an existing VM +: Follow the procedure in article [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html) to assign a new floating IP to it. + +Assign floating IP while creating a new VM from scratch +: That is the approach in articles from Prerequisite No. 5. + +**Kubernetes services can have an automatically assigned floating IP** +: The following article shows how to deploy an HTTPS service on Kubernetes: + +[Deploying HTTPS Services on Magnum Kubernetes in CloudFerro Cloud Cloud](../kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html.md b/docs/cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..33ab5e4 --- /dev/null +++ b/docs/cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html.md @@ -0,0 +1,37 @@ +Dashboard Overview – Project Quotas And Flavors Limits on CloudFerro Cloud[](#dashboard-overview-project-quotas-and-flavors-limits-on-brand-name "Permalink to this headline") +=============================================================================================================================================================================== + +While using CloudFerro Cloud platform, one of the first things you will spot is the “Limit Summary”. Each project is restricted by preset quotas. This is preventing system capacities from being exhausted without notification and guaranteeing free resources. + +On the first screen after logging into Horizon Dashboard you will see seven charts reflecting limits most essential to the stability of the platform. You can always show this screen with command **Compute** -> **Overview**. + +![dashboardover1-v2.png](../_images/dashboardover1-v2.png) + +Instances +: Number of virtual machines your project can contain at once, regardless of the flavors (it could be eo1.xsmall as well as hm.2xlarge). + +VCPUs +: Number of cores you can assign while launching VMs of different flavors (it varies for each flavor, for example eo1.xsmall has only one core, while eo1.large has four VCPUs). + +RAM +: The amount of RAM you have available in you project according to the assigned quota. + +Floating IPs +: A pool of unique Floating IP addresses assigned only to your project. + +Security Groups +: Two of the ten Security Groups are preset during the creation of the domain (one is a default group and the second one allows connection via SSH and RDP and pinging instances). + +Volumes +: Disks provided only by flavor (unchecked “Create new volume” while instances creation) won’t count in. + +Volume Storage +: You can store data from your instances and disposable volumes. + +During the VM creation process, while choosing flavor, you may spot a yellow exclamation mark next to some values. It means that the remaining resources are exceeding the quota, or (more rarely) that this flavor is unavailable due to some maintenance reason. + +![dashboardover2-v2.png](../_images/dashboardover2-v2.png) + +You can expand the flavor summary by clicking the arrow on the left. The charts will show the current free resources as well as the resources that will remain after creating a new instance. + +If the quota would be exceeded, OpenStack will non allow to choose this particular flavor. \ No newline at end of file diff --git a/docs/cloud/How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md b/docs/cloud/How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..64a9e5a --- /dev/null +++ b/docs/cloud/How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,151 @@ +How To Create a New Linux VM With NVIDIA Virtual GPU in the OpenStack Dashboard Horizon on CloudFerro Cloud[](#how-to-create-a-new-linux-vm-with-nvidia-virtual-gpu-in-the-openstack-dashboard-horizon-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================================================================== + +You can create Linux virtual machine with NVIDIA RTX A6000 as the additional graphics card. The card contains + +> * 10,752 CUDA cores for rendering, graphics operations and heavy parallel computations, +> * 336 Tensor cores which accelerate AI and data science model training, while +> * 84 RT cores speed up ray tracing with shading or denoising, photorealistic rendering and so on. + +There are four variants, using 6, 12, 24, or 48 GB of VGPU RAM. You will be able to select the particular model by choosing a proper flavor when creating the instance in Horizon (see below). + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to create an instance with NVIDIA support +> * How to choose the proper flavor for the data in hand +> * How to add proper keypair in order to +> * SSH into the virtual machine you create, or +> * use the console within Horizon interface and +> * verify that you are using the NVIDIA vGPU. + +Step 1 Create New Instance with NVIDIA Image Support[](#step-1-create-new-instance-with-nvidia-image-support "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------- + +To define a new instance, use the following series of commands: + +> **Project → Compute → Instances.** + +![compute_instances.png](../_images/compute_instances.png) + +Click **Launch Instance** to get the following screen: + +![launch_instance.png](../_images/launch_instance.png) + +Insert the name of the instance (eg. “vm\_with\_vgpu”) and click Next button. In the next screen, you will choose the operating system for the new virtual machine you are defining: + +![choose_os.png](../_images/choose_os.png) + +Your goal is to use an image with predefinced NVIDIA support. To list all such images, click on field **Available** and enter ‘NVIDIA’ into it. Only the images with NVIDIA in their names will be listed: + +![nvidia_chosen_cloudferro_cloud.png](../_images/nvidia_chosen_cloudferro_cloud.png) + +Select Instance Boot Source (eg. “Image”), and choose desired image (eg. “Ubuntu 20.04 NVIDIA”) by clicking on arrow. + +Images marked with “NVIDIA” are fully operational. They come preinstalled with + +> * special NVIDIA Grid drivers +> * a licence token, as well as +> * the CUDA library. + +Note + +If you do not need to have the system disk bigger than the size defined in a chosen flavor, we recommend setting “Create New Volume” feature to “No” state. + +Click on the Next button and get to the following screen: + +![createnew18.png](../_images/createnew18.png) + +You will now choose one of the four models of the RTX A6000 card. + +Step 2 Select Card Model / Flavor[](#step-2-select-card-model-flavor "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +The four available: **RTXA6000-6C**, **RTXA6000-12C**, **RTXA6000-24C**, and **RTXA6000-48C**, are described in this table: + +![createnew16.png](../_images/createnew16.png) + +The column VM Name contains flavor names *vm.a6000.1*, *vm.a6000.2*, *vm.a6000.4*, *vm.a6000.8*. Again, type *a6000* into the field **Available** and list only the NVIDIA flavors: + +![createnew19.png](../_images/createnew19.png) + +Taking into account the data from the table above, if you select flavor *vm.a6000.2*, you will use **4** virtual cores and **28** GB of “normal” RAM, and simultaneously, you will also choose the **RTXA6000-12C** model with **12** GB of virtual GPU RAM. + +Note + +Yellow triangles in the listing mean that you cannot select that row as one of the system resources is already engaged to other instances. If you, say, wanted to select the strongest flavor of NVIDIA, *vm.a6000.8*, you would first have to obtain 112 GB or more of available of RAM and only then be able to opt for that flavor. + +In the situation above, select *vm.a6000.2* and continue going through the usual motions of selecting instance elements to finish the procedure. + +Step 3 Finish Creating the Instance[](#step-3-finish-creating-the-instance "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +Click “Networks” and then choose desired networks. + +![networks5.png](../_images/networks5.png) + +Open “Security Groups” After that, choose “allow\_ping\_ssh\_icmp\_rdp” and “default”. + +![createnew6.png](../_images/createnew6.png) + +Choose or generate SSH keypair, as explained in article [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html) for your VM. Next, launch your instance by clicking on blue button. + +![createnew7.png](../_images/createnew7.png) + +You will see “Instances” menu with your newly created VM. + +![createnew8.png](../_images/createnew8.png) + +Note + +If you want to make your VM accessible from the Internet, see this article: [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html) + +Step 4 Issue Commands from the Console[](#step-4-issue-commands-from-the-console "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +Open the drop-down menu and choose “Console”. + +![createnew9.png](../_images/createnew9.png) + +You can connect to your virtual machine using SSH, see this article: [How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud](../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html) + +You can also use the SPICE console using the Openstack Dashboard. + +Click on the black terminal area (to activate access to the console). Type: + +``` +eoconsole + +``` + +and hit Enter on the keyboard. + +![createnew10.png](../_images/createnew10.png) + +Insert and retype new password. + +![createnew11.png](../_images/createnew11.png) + +Now you can type commands. + +![createnew12.png](../_images/createnew12.png) + +To check the status of the **vGPU** device, enter the command: + +``` +nvidia-smi + +``` + +![createnew13.png](../_images/createnew13.png) + +After you finish, type “exit”. + +``` +exit + +``` + +![createnew14.png](../_images/createnew14.png) + +This will close the session. \ No newline at end of file diff --git a/docs/cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..8210ee1 --- /dev/null +++ b/docs/cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html.md @@ -0,0 +1,111 @@ +How to access the VM from OpenStack console on CloudFerro Cloud[](#how-to-access-the-vm-from-openstack-console-on-brand-name "Permalink to this headline") +=========================================================================================================================================================== + +Once you have created a virtual machine in OpenStack, you will need to perform various administrative tasks such as: + +> * installing and uninstalling software, +> * uploading and downloading files, +> * setting up passwords and access policies + +and so on. There are three ways to enter the back end part of virtual machines: + +**Linux** +: For Linux, either of the Ubuntu or CentOS variety, you will be using the console that is present with every VM. You enter the console as a predefined user called **eoconsole**, define the password and switch to another, also predefined, user called **eouser**. After that, each time you are use the console, you will be present as **eouser**. + +**Windows** +: You only need to create an *Administrator* profile within the virtual machine. Once you do that, you will work with Windows just like on the desktop computer, with possible delays in response due to the speed of Internet connection you have. + +**Fedora** +: Fedora images technically belong to the family of Linux operating systems, but cannot be accessed via the console. To be more precise, you will see the console but won’t be able to log in as the standard **eoconsole** user. + + As these images are only used for automatic creation of Kubernetes instances, you have to enter them using Kubernetes methods. That boils down to using **kubectl exec** command (see below). + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Use console for Linux based virtual machines +> * Use console for Windows based virtual machines +> * Use console for Fedora base virtual machines + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +Using console for administrative tasks within Linux based VMs[](#using-console-for-administrative-tasks-within-linux-based-vms "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +1. Go to and select your authentication method: + +![login_cloudferrocloud.png](../_images/login_cloudferrocloud.png) + +You will enter the Horizon main screen. + +2. Open the **Compute/Instances** tab and select the desired VM by clicking on its name: + +![accessvm2.png](../_images/accessvm2.png) + +3. Select **“Console”** pane + +![accessvm3.png](../_images/accessvm3.png) + +4. When logging in for the first time, you will see the generic console screen: + +![accessvm4v2.png](../_images/accessvm4v2.png) + +Click on link **Click here to show only console** and then click on the console surface to make it active. + +Enter the predefined user name **eoconsole**. You will be asked to set up a new password, twice. This user **eoconsole** serves only for you to enter the console. + +The next step is to start using another user, called **eouser**. Just like **eoconsole**, it is already defined for you, so you only need to switch from **eoconsole** to **eouser**. Linux command to do that is + +``` +sudo su - eouser + +``` + +![sudo_su_eouser.png](../_images/sudo_su_eouser.png) + +You will then use the console as a predefined user called **eouser**. + +Attention + +Google Chrome seems to work slowly while using the OpenStack console. Firefox works well. + +Using console to perform administrative tasks within Fedora VMs[](#using-console-to-perform-administrative-tasks-within-fedora-vms "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------- + +For normal VMs, choose either Ubuntu- or CentOS-based images while creating a VM – but not Fedora. It is meant only for automatic creation of instances that belong to Kubernetes clusters. Such instances will have either word *master* or *node* in their names. Here is a typical series of instances that belong to two different clusters, called *vault* and *k8s-23*: + +![some_nodes.png](../_images/some_nodes.png) + +So if you click on any of these Kubernetes instances, you will be able to enter the console but will not be able to use it. In this context, Fedora image is **intentionally** set up in such a way that you **cannot enter it through the console**. You will, typically, see this after Fedora starts: + +![fedora_image.png](../_images/fedora_image.png) + +Instead, it is possible to enter one such instance using main Kubernetes command, **kubectl** with parameter **exec**. The main command would look like this: + +``` +kubectl -n vault exec -it vault-0 -- sh + +``` + +where *vault* is the namespace within which the pod *vault-0* will be found and entered. + +Further explanations of **exec** command are out of scope of this article. The following article will show you how to activate the **kubectl** command after the cluster has been created: + +[How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](../kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +This article shows an example of an **exec** command to enter the VM and, later, save the data within it: + +[Volume-based vs Ephemeral-based Storage for Kubernetes Clusters on CloudFerro Cloud OpenStack Magnum](../kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html) + +### Performing administrative tasks within Windows based VMs[](#performing-administrative-tasks-within-windows-based-vms "Permalink to this headline") + +In case of **Windows** set a new password for *Administrator* profile. + +![accessvm5.png](../_images/accessvm5.png) + +You will then be able to perform administrative tasks on your instance. \ No newline at end of file diff --git a/docs/cloud/How-to-clone-existing-and-configured-VMs-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-clone-existing-and-configured-VMs-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..8f20464 --- /dev/null +++ b/docs/cloud/How-to-clone-existing-and-configured-VMs-on-CloudFerro-Cloud.html.md @@ -0,0 +1,35 @@ +How to clone existing and configured VMs on CloudFerro Cloud[](#how-to-clone-existing-and-configured-vms-on-brand-name "Permalink to this headline") +===================================================================================================================================================== + +The simplest way to create the snapshot of your machine is using “Horizon” - graphical interface of OpenStack dashboard. + +In summary, there will be 2 operations: + +1. Creating snapshot +2. Restoring snapshot to newly created VM. + +To start, please visit our website and login. + +![saml_cloudferro_cloud.png](../_images/saml_cloudferro_cloud.png) + +After logon, in **“Instances”** menu select VM to be cloned, and create its snapshot by clicking “Actions” Menu + +![clone2.png](../_images/clone2.png) + +Once the snapshot is ready, you may see it on **“Images”** page of Horizon. Select its name to see properties. + +![clone3.png](../_images/clone3.png) + +Now, you may click **“Launch”** in right upper corner of the window or just go back to **“Instances”** menu and launch new instance. + +Full manual is here: [How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud](How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html) + +But if this process is familiar to you, there is only one difference. Chose as the source **“boot from snapshot”** instead of **“boot from image”** and select your snapshot from the list below. In next steps select parameters (flavour, size), at least the same as the original one. (“Launch instance” button will be unavailable until all necessary settings were completed). + +The new machine gets configured as a clone of the original one, except of network addresses (new floating-ip must be associated) and network policies. + +Caution + +If the original machine had any additional volumes attached to it, they should also be cloned. + +You may also want to read: [Volume snapshot inheritance and its consequences on CloudFerro Cloud](../datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..37653c8 --- /dev/null +++ b/docs/cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html.md @@ -0,0 +1,219 @@ +How to create Windows VM on OpenStack Horizon and access it via web console on CloudFerro Cloud[](#how-to-create-windows-vm-on-openstack-horizon-and-access-it-via-web-console-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================================================================== + +This article provides a straightforward way of creating a functional Windows VM on CloudFerro Cloud cloud, using the Horizon graphical interface. + +The idea is to + +> * start the creation of a Windows virtual machine from the default Horizon dashboard and then +> * access it via the web console, + +all from your Internet browser. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Accessing the Launch Instance menu +> * Choosing the Instance name +> * Choosing source +> * Choosing flavor +> * Choosing networks +> * Choosing security groups +> * Launching virtual machine +> * Setting **Administrator** password + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +Step 1: Access the Launch Instance menu[](#step-1-access-the-launch-instance-menu "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------- + +In the Horizon dashboard, navigate to **Compute -> Instances**. Click the **Launch Instance** at the top of the **Instances** section: + +![create-windows-vm-horizon-web-console-01_creodias.png](../_images/create-windows-vm-horizon-web-console-01_creodias.png) + +You should get the following window: + +![create-windows-vm-horizon-web-console-02_creodias.png](../_images/create-windows-vm-horizon-web-console-02_creodias.png) + +Step 2: Choose the instance name[](#step-2-choose-the-instance-name "Permalink to this headline") +-------------------------------------------------------------------------------------------------- + +In the window which appeared, enter the name you wish to give to your instance in the **Instance Name** text field. In this example, we use **test-windows-vm** as the name: + +![create-windows-vm-horizon-web-console-03_creodias.png](../_images/create-windows-vm-horizon-web-console-03_creodias.png) + +Click **Next >**. + +Step 3: Choose source[](#step-3-choose-source "Permalink to this headline") +---------------------------------------------------------------------------- + +The default value in the drop-down menu **Select Boot Source** is **Image**, meaning that you will choose from one of the images that are present in your version of Horizon. If another value is selected, revert to **Image** instead. + +![create-windows-vm-horizon-web-console-04_creodias.png](../_images/create-windows-vm-horizon-web-console-04_creodias.png) + +Enter **windows** in the search field in the **Available** section to filter Windows images: + +![create-windows-vm-horizon-web-console-05_creodias.png](../_images/create-windows-vm-horizon-web-console-05_creodias.png) + +Choose the newest available version by clicking **↑** next to it. As of writing of this article, it is **Windows 2022**. + +![create-windows-vm-horizon-web-console-06_creodias.png](../_images/create-windows-vm-horizon-web-console-06_creodias.png) + +Your chosen image should appear in the **Allocated** section: + +![create-windows-vm-horizon-web-console-07_creodias.png](../_images/create-windows-vm-horizon-web-console-07_creodias.png) + +Click **Next >**. + +If you allocate a wrong image by mistake, you can remove it from the **Allocated** section by clicking **↓** next to its name. + +Step 4: Choose flavor[](#step-4-choose-flavor "Permalink to this headline") +---------------------------------------------------------------------------- + +In this step you will choose the flavor of your virtual machine. Flavors manage access to resources such as VCPUS, RAM and storage. + +The following screenshot shows what the flavors table looks like in general: + +![create-windows-vm-horizon-web-console-09_creodias.png](../_images/create-windows-vm-horizon-web-console-09_creodias.png) + +The presence of yellow warning triangles means that the flavor in that row is unavailable to you. To see the exact reason for this unavailability, hover your mouse over that triangle, like so: + +![create-windows-vm-horizon-web-console-21_creodias.png](../_images/create-windows-vm-horizon-web-console-21_creodias.png) + +Here are the flavors which you can choose when creating a Windows virtual machine in each particular cloud: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +On WAW4-1 cloud there are no flavors which have the name containing with **w** so it cannot be used to run Windows. + +On WAW3-1 cloud, only flavors which have the name starting with **hmw** can be used to run Windows. + +Filter them by entering **hmw** in the search bar in the **Available** section: + +![create-windows-vm-horizon-web-console-23_creodias.png](../_images/create-windows-vm-horizon-web-console-23_creodias.png) + +On WAW3-2 cloud, only flavors which have the name starting with **hmaw** can be used to run Windows. + +Filter them by entering **hmaw** in the search bar in the **Available** section: + +![create-windows-vm-horizon-web-console-24_creodias.png](../_images/create-windows-vm-horizon-web-console-24_creodias.png) + +On FRA1-2 cloud, only flavors which have the name starting with **hmw** can be used to run Windows. + +Filter them by entering **hmw** in the search bar in the **Available** section: + +![create-windows-vm-horizon-web-console-25_creodias.png](../_images/create-windows-vm-horizon-web-console-25_creodias.png) + +Always be sure to check the actual flavors (that info can be found in the Horizon dashboard). + +Choose the flavor which suits you best and click **↑** next to it to allocate it. + +Click **Next >**. + +Note + +In examples that follow, we use two networks, one with name starting with **cloud\_** and the name of the other starting with **eodata\_**. The former network should always be present in the account, but the latter may or may not present. If you do not have network which name starts with **eodata\_**, you may create it or use any other network that you already have and want to use. + +Step 5: Attach networks to your virtual machine[](#step-5-attach-networks-to-your-virtual-machine "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------- + +The next step contains the list of networks available to you: + +![create-windows-vm-horizon-web-console-10_creodias.png](../_images/create-windows-vm-horizon-web-console-10_creodias.png) + +By default, you should have access to the following networks: + +> * A network which has the same name as your project - it can be used to connect your virtual machines together and access the Internet. +> * The network which has **eodata** in its name - it can be used to access the EODATA repository containing Earth observation data. + +Allocate both of them and click **Next >**. + +The next step is called **Network Ports**. In it simply quick **Next >** without doing anything else. + +Step 6: Choose security groups[](#step-6-choose-security-groups "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +Security groups control Internet traffic for your virtual machine. + +In this step, make sure that the **default** security group is allocated. It blocks incoming network traffic and allows outgoing network traffic. + +Group **allow\_ping\_ssh\_icmp\_rdp** exposes your VM to various types of network traffic but here, do **not** allocate it. It is not needed for the purposes of this article, since you will only access your virtual machine using the web console. You should still be able to perform standard Windows operations such as browsing the Internet or accessing e-mail without this security group. + +![create-windows-vm-horizon-web-console-11_creodias.png](../_images/create-windows-vm-horizon-web-console-11_creodias.png) + +Step 7: Launch your virtual machine[](#step-7-launch-your-virtual-machine "Permalink to this headline") +-------------------------------------------------------------------------------------------------------- + +Other steps from the **Launch Instance** window are optional. Once you have done the previous steps of this article, click **Launch Instance** button: + +![create-windows-vm-horizon-web-console-12_creodias.png](../_images/create-windows-vm-horizon-web-console-12_creodias.png) + +Your virtual machine should appear in the **Instances** section of the Horizon dashboard. Wait until its **Status** is **Active**: + +![create-windows-vm-horizon-web-console-13_creodias.png](../_images/create-windows-vm-horizon-web-console-13_creodias.png) + +Once the **Status** is **Active**, the virtual machine should be running. The next step involves setting access to it. + +Step 8: Set the Administrator password[](#step-8-set-the-administrator-password "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------- + +Once your instance has **Active** status, click on its name: + +![create-windows-vm-horizon-web-console-14_creodias.png](../_images/create-windows-vm-horizon-web-console-14_creodias.png) + +You should see a page containing information about your instance. Navigate to **Console** tab: + +![create-windows-vm-horizon-web-console-15_creodias.png](../_images/create-windows-vm-horizon-web-console-15_creodias.png) + +You should see the web console with which you can control your virtual machine. When the system finishes startup, you will see prompt to set the Administrator password: + +![create-windows-vm-horizon-web-console-16_creodias.png](../_images/create-windows-vm-horizon-web-console-16_creodias.png) + +Click **OK**. You should now see two text fields: + +![create-windows-vm-horizon-web-console-17_creodias.png](../_images/create-windows-vm-horizon-web-console-17_creodias.png) + +Enter your chosen password in the **New password** text field. + +Enter it again in the **Confirm password** text field. + +Click right arrow next to the **Confirm password** text field: + +![create-windows-vm-horizon-web-console-18_creodias.png](../_images/create-windows-vm-horizon-web-console-18_creodias.png) + +You should get the following confirmation: + +![create-windows-vm-horizon-web-console-19_creodias.png](../_images/create-windows-vm-horizon-web-console-19_creodias.png) + +Click **OK**. + +Wait until you see the standard Windows desktop. + +Step 9: Update Windows[](#step-9-update-windows "Permalink to this headline") +------------------------------------------------------------------------------ + +Once the Windows virtual machine is up and running, you should update its operating system to have the latest security fixes. Click **Start**, and then **Settings**: + +![create-windows-vm-horizon-web-console-26_creodias.png](../_images/create-windows-vm-horizon-web-console-26_creodias.png) + +After that, click **Update & Security**: + +![create-windows-vm-horizon-web-console-27_creodias.png](../_images/create-windows-vm-horizon-web-console-27_creodias.png) + +You should now see **Windows Update** screen, which can look like this: + +![create-windows-vm-horizon-web-console-28_creodias.png](../_images/create-windows-vm-horizon-web-console-28_creodias.png) + +Follow the appropriate prompts to update your operating system. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +If you want to access your virtual machine remotely using RDP (Remote Desktop Protocol), you should consider increasing its security by using a bastion host. The following article contains more information: [Connecting to a Windows VM via RDP through a Linux bastion host port forwarding on CloudFerro Cloud](../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html) + +To learn more about security groups, you can check this article: [How to use Security Groups in Horizon on CloudFerro Cloud](How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..5649829 --- /dev/null +++ b/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html.md @@ -0,0 +1,261 @@ +How to create a Linux VM and access it from Linux command line on CloudFerro Cloud[](#how-to-create-a-linux-vm-and-access-it-from-linux-command-line-on-brand-name "Permalink to this headline") +================================================================================================================================================================================================= + +Creating a virtual machine in a CloudFerro Cloud cloud allows you to perform computations without having to engage your own infrastructure. In this article you shall create a Linux based virtual machine and access it remotely from a Linux command line on a desktop or laptop. + +If you want to access Linux VM from a Windows based command line, follow this article instead: [How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html). + +Note + +This article only covers the basics of creating a VM - it does not cover topics such as use of NVIDIA hardware or creating a volume during the creation of a VM. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a Linux virtual machine in CloudFerro Cloud cloud using command **Launch Instance** from Horizon Dashboard + +You will enter the following required data into that window: + +> * Instance name +> * Instance source (from an operating system image) +> * Instance flavor (the combination of CPU, memory and storage capacity) +> * Networks that the newly created VM will use + +Then create elements later needed for SSH connection: + +> * Security groups to control access to the machine and +> * A key pair for SSH access to the Linux based VM in the cloud + +For external access + +> * Attach a floating IP to the instance so that it can be found on the Internet and, finally, +> * Use SSH to connect to that virtual machine from another Linux based system + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Basic knowledge of Linux terminal** + +You should have some experience with Linux command line interface. + +No. 3 **Linux installed on your local computer** + +A Linux distribution running on your computer. This article was written for Ubuntu 20.04 LTS so please adjust the commands to your version of Linux. + +No. 4 **SSH client installed and configured on your local Linux computer** + +The SSH client must be installed and configured on your local Linux computer. Please see [Generating an SSH keypair in Linux on CloudFerro Cloud](../networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html). + +If you already have an SSH key pair and an SSH client configured, you should import your public key to the Horizon dashboard. The following article contains information how to do it: [How to import SSH public key to OpenStack Horizon on CloudFerro Cloud](../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html). + +Alternatively, you can also create a key pair directly in the Horizon: + +[How to create key pair in OpenStack Dashboard on CloudFerro Cloud](How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +Options for creation of a Virtual Machine (VM)[](#options-for-creation-of-a-virtual-machine-vm "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +Creation of a virtual machine is divided into 11 sections, four of which are mandatory (denoted by an asterisk in the end of the name of the option). In addition to those four (**Details**, **Source**, **Flavor**, and **Networks**), we shall define **Security Groups** and **Key Pairs**. The rest of the options to launch an instance is out of scope of this article. + +Note + +In OpenStack terminology, a *virtual machine* is also an *instance*. *Instance* is a broader term as not all instances need be virtual machines, it is also possible to use real hardware as an instance. + +The window to create a virtual machine is called **Launch Instance**. You will enter all the data about an instance into that window and its options. + +Step 1 Start the Launch Instance window and name the virtual machine[](#step-1-start-the-launch-instance-window-and-name-the-virtual-machine "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +In the Horizon dashboard go to **Compute** -> **Instances** and click **Launch Instance**. You should get the following window: + +![create-linux-linux-04_creodias.png](../_images/create-linux-linux-04_creodias.png) + +Type the name for your virtual machine in the **Instance Name** text field. + +Click **Next** or the **Source** option on the left side menu. + +Step 2 Define the source of the virtual machine[](#step-2-define-the-source-of-the-virtual-machine "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +The **Source** window appears: + +![create-linux-linux-05_creodias.png](../_images/create-linux-linux-05_creodias.png) + +Make sure that from the drop-down menu **Select Boot Source** option **Image** is selected. + +![boot_source.png](../_images/boot_source.png) + +From the **Available** list choose Linux distribution that suits you best and click **↑** next to it. It should now be visible in the **Allocated** section: + +![create-linux-linux-06_creodias.png](../_images/create-linux-linux-06_creodias.png) + +This image shows that a Ubuntu 20.04 LTS was selected; if you, however, chose CentOS 7, that is what would show here instead of Ubuntu 20.04 LTS. + +If you change your mind, click **↓** to unselect a source and then choose a different one. + +Images which have **NVIDIA** in their name contain NVIDIA hardware. This article does not cover their use. Therefore, make sure that you choose the image without it. + +Also, make sure that in the section **Create New Volume** option **No** is selected. + +Click **Next** or click on button **Flavor** to define the flavor of the instance. + +Step 3 Define the flavor of the instance[](#step-3-define-the-flavor-of-the-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +You should now see the following form: + +![create-linux-linux-07_creodias.png](../_images/create-linux-linux-07_creodias.png) + +The standard definition of OpenStack *flavor* is the amount of resources available to the instance - like VCPU, memory and storage capacity. + +Choose the one which suits you best and click **↑** next to it. + +Make sure that you do **not** select one of the below flavors - they contain NVIDIA hardware and this article does not cover their use. + +> * **vm.a6000.1** +> * **vm.a6000.2** +> * **vm.a6000.4** +> * **vm.a6000.8** + +Sometimes, a flavor might be insufficient for source you chose in the previous step. If this is the case, you will see a yellow warning sign next to at least one of the values in the row for that flavor: + +![yellow_triangles.png](../_images/yellow_triangles.png) + +To solve this issue, choose a flavor that supports your chosen source instead. In the image above, *vm.a6000.4* is not available but, say, *hm.large* is. + +Another possible explanation might be that your quota is too low for creating a VM with your chosen flavor. You can see your quota in the **Compute -> Overview** section of your Horizon dashboard. If that is the case, you can either: + +* choose a different flavor or +* contact the CloudFerro Cloud Support to request quota increase - [Helpdesk and Support](../accountmanagement/Help-Desk-And-Support.html). + +Click **Next** or click **Networks** to define networks. + +Step 4 Define networks for the virtual machine[](#step-4-define-networks-for-the-virtual-machine "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +You should now see the following window: + +![create-linux-linux-08_creodias.png](../_images/create-linux-linux-08_creodias.png) + +Here you can select networks that will be attached to your virtual machine. They control the way your machine is connected to the Internet, to the other machines and to other resources as well. + +By default, you should have access to the network whose name starts with **cloud\_**, which allows you to connect your machines together. It also has access to the **external** network which gives the instance access to the Internet. + +Choose that network and also choose any other network that you want to access through the newly created VM. + +These were the obligatory options. Since you want to access the instance through an SSH connection, you will need to define **Security Groups** and **Key Pair**. + +Step 5 Define security groups for VM[](#step-5-define-security-groups-for-vm "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Security groups control network traffic to and from your virtual machine. + +Click **Security Groups**. You should see the following form: + +![create-linux-linux-09_creodias.png](../_images/create-linux-linux-09_creodias.png) + +By default, you have access to two groups: + +> * **default** which blocks all incoming traffic and allows all outgoing traffic +> * **allow\_ping\_ssh\_icmp\_rdp** which allows incoming Ping, SSH, ICMP and RDP connections + +Enable both of these rules. One of the open ports in **allow\_ping\_ssh\_icmp\_rdp** is 22, which is a prerequisite for SSH access. + +Step 6 Create a key pair for SSH access[](#step-6-create-a-key-pair-for-ssh-access "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +To use SSH to connect your local Linux computer to the cloud Linux “computer”, you will need to provide one public and one secret key. (Keys are random strings, usually hundreds of characters long.) + +Click **Key Pair**. You should now see the following window: + +![create-linux-linux-10_creodias.png](../_images/create-linux-linux-10_creodias.png) + +In the image above, the key is called **test-key**. There are three ways to enter the keys into this window: + +> * using option **Create Key Pair** – create it on the spot, +> * using option **Import Key Pair** – take the keys you already have and upload them to the cloud, +> * using one of the key pairs that were already existing within OpenStack cloud. + +If you haven’t created your key pair yet, please follow Prerequisite No. 4. + +Anyways, make sure that your uploaded key is in the **Allocated** section. + +Step 7 Create the instance[](#step-7-create-the-instance "Permalink to this headline") +--------------------------------------------------------------------------------------- + +Once you have set everything up, click **Launch Instance**. + +Your instance should now be in the **Instances** list. Initially, the instance will be in a state of “Spawning” as in this image: + +![create-linux-linux-12_creodias.png](../_images/create-linux-linux-12_creodias.png) + +Spawning is the process of preparing the instance. + +Wait up to a few minutes until your instance has finished spawning. The next state is **Running** label in the **Power State** column: + +![create-linux-linux-13_creodias.png](../_images/create-linux-linux-13_creodias.png) + +It means that the instance is ready to use. + +In Step 4 you have attached a network with the name that starts with **cloud\_**. It allows the instance to send and receive data from other instances in the cloud and the Internet but does not automatically provide a static IP address. Such address is important if you want to host a website or access the instance via the SSH protocol. + +Just like on the above screenshot, under header **IP Address**, you will see network addresses which both start with **10.**. It means that they are local network addresses. If you want to access your instance remotely, it must have a static IP address. The way to add it is to attach a so-called *floating IP* address to the instance. + +Step 8 Attach a Floating IP to the instance[](#step-8-attach-a-floating-ip-to-the-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +Here is how to create and attach a floating IP to your instance: [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html). + +Once you have added the floating IP, you will see it in the Horizon dashboard under header **IP Address** - just like in the last image from that article: + +![ip_address_from_article.png](../_images/ip_address_from_article.png) + +The floating IP address in that article is **64.225.132.0**. Your address will vary. + +Step 9 Connecting to your virtual machine using SSH[](#step-9-connecting-to-your-virtual-machine-using-ssh "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------- + +The following article has information about connecting to a virtual machine using SSH: [How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud](../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html). + +The last command in that article was: + +``` +ssh [email protected] + +``` + +The IP address in that article is **64.225.132.99** and is different from the address from the previous article. Instead of IP addresses used in these articles (**64.225.132.99** and **64.225.132.0**), enter the IP address of your instance which you saw after doing Step 8. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +CloudFerro Cloud cloud can be used for general hosting needs, such as + +> * installing LAMP servers, +> * installing and using WordPress servers, +> * email servers, +> * Kubernetes and SLURM clusters and so on. + +To create a *cluster* of instances, see the series of articles on Kubernetes: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](../kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +If you find yourself unable to connect to your virtual machine using SSH, you can use the web console for troubleshooting and other purposes. Here’s how to do it: + +[How to access the VM from OpenStack console on CloudFerro Cloud](How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html) + +If you don’t want the storage of your instance to be deleted while the VM is removed, you can choose to use a volume during instance creation. Please see the following articles: + +[VM created with option Create New Volume No on CloudFerro Cloud](VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html) + +[VM created with option Create New Volume Yes on CloudFerro Cloud](VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html). + +You can’t apply the SSH keys uploaded to the Horizon dashboard directly to a VM after its creation. The following article presents a walkaround to this problem: + +[How to add SSH key from Horizon web console on CloudFerro Cloud](../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html). + +If you find that the storage of your VM is insufficient for your needs, you can attach the volume to it after its creation. The following articles contain appropriate instructions: [How to attach a volume to VM less than 2TB on Linux on CloudFerro Cloud](../datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html) and [How to attach a volume to VM more than 2TB on Linux on CloudFerro Cloud](../datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..8de7c83 --- /dev/null +++ b/docs/cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html.md @@ -0,0 +1,373 @@ +How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud[](#how-to-create-a-linux-vm-and-access-it-from-windows-desktop-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================================== + +Creating a virtual machine in a CloudFerro Cloud cloud allows you to perform computations without having to engage your own infrastructure. In this article you shall create a Linux based virtual machine and access it remotely using PuTTY on Windows. + +If you want to access Linux VM from a Linux command line, follow this article instead: [How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html). + +Note + +This article only covers the basics of creating a VM - it does not cover topics such as use of NVIDIA hardware or creating a volume during the creation of a VM. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a Linux virtual machine in CloudFerro Cloud cloud using command **Launch Instance** from Horizon Dashboard + +You will enter the following data into that window: + +> * Instance name +> * Instance source (from an operating system image) +> * Instance flavor (the combination of CPU, memory and storage capacity) +> * Networks that the newly created VM will use + +Then create elements later needed for SSH connection: + +> * Security groups to control access to the machine +> * A chosen key pair for SSH access to the Linux based VM in the cloud + +For external access + +> * Attach a floating IP to the instance so that it can be found on the Internet. + +After that, you will connect to a VM using PuTTY: + +> * Convert the public key to the format compatible with PuTTY +> * Configure PuTTY +> * Save PuTTY configuration +> * Connect to a VM + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Basic knowledge of Linux terminal** + +You should have some experience with Linux command line interface. + +No. 3 **Windows** + +You need to have Microsoft Windows 10 or newer installed on your computer. + +No. 4 **PuTTY installed on your local Windows computer** + +You should have PuTTY installed on your computer. You can download it from the following website: . + +No. 5 **SSH key** + +You need to have an SSH key pair. It consists of a public and private key. You can use your existing pair in this workflow or create a new one. If you do not have one, you have several options, such as: + +* Generate them directly using the Horizon dashboard: [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +* Generate your key pair using the Windows command line. Please check this article: [How to Create SSH Key Pair in Windows 10 On CloudFerro Cloud](../windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html). If you choose that option, make sure that you upload your public key to the Horizon dashboard: [How to import SSH public key to OpenStack Horizon on CloudFerro Cloud](../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html). + +This article contains information about configuring PuTTY using one such key pair. + +Options for creation of a Virtual Machine (VM)[](#options-for-creation-of-a-virtual-machine-vm "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +Creation of a virtual machine is divided into 11 sections, four of which are mandatory (denoted by an asterisk in the end of the name of the option). In addition to those four (**Details**, **Source**, **Flavor**, and **Networks**), we shall define **Security Groups** and **Key Pairs**. The rest of the options to launch an instance is out of scope of this article. + +Note + +In OpenStack terminology, a *virtual machine* is also an *instance*. *Instance* is a broader term as not all instances need be virtual machines, it is also possible to use real hardware as an instance. + +The window to create a virtual machine is called **Launch Instance**. You will enter all the data about an instance into that window. + +Step 1 Start the Launch Instance window and name the virtual machine[](#step-1-start-the-launch-instance-window-and-name-the-virtual-machine "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +In the Horizon dashboard go to **Compute** -> **Instances** and click **Launch Instance**. You should get the following window: + +![create-linux-linux-04_creodias.png](../_images/create-linux-linux-04_creodias.png) + +Type the name for your virtual machine in the **Instance Name** text field. + +Click **Next** or the **Source** option on the left side menu. + +Step 2 Define the source of the virtual machine[](#step-2-define-the-source-of-the-virtual-machine "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +The **Source** window appears: + +![create-linux-linux-05_creodias.png](../_images/create-linux-linux-05_creodias.png) + +Make sure that from the drop-down menu **Select Boot Source** option **Image** is selected. + +![boot_source.png](../_images/boot_source.png) + +From the **Available** list choose Linux distribution that suits you best and click **↑** next to it. It should now be visible in the **Allocated** section: + +![create-linux-linux-06_creodias.png](../_images/create-linux-linux-06_creodias.png) + +This image shows that a Ubuntu 20.04 LTS was selected; if you, however, chose CentOS 7, that is what would show here instead of Ubuntu 20.04 LTS. + +If you change your mind, click **↓** to unselect a source and then choose a different one. + +Images which have **NVIDIA** in their name contain NVIDIA hardware. This article does not cover their use. Therefore, make sure that you choose the image without it. + +Also, make sure that in the section **Create New Volume** option **No** is selected. + +Click **Next** or click on button **Flavor** to define the flavor of the instance. + +Step 3 Define the flavor of the instance[](#step-3-define-the-flavor-of-the-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +You should now see the following form: + +![create-linux-linux-07_creodias.png](../_images/create-linux-linux-07_creodias.png) + +The standard definition of OpenStack *flavor* is the amount of resources available to the instance - like VCPU, memory and storage capacity. + +Choose the one which suits you best and click **↑** next to it. + +Warning + +Make sure that you do **not** select one of the below flavors - they contain NVIDIA hardware and this article does not cover their use. + +> * **vm.a6000.1** +> * **vm.a6000.2** +> * **vm.a6000.4** +> * **vm.a6000.8** + +Sometimes, a flavor might be insufficient for source you chose in the previous step. If this is the case, you will see a yellow warning sign next to at least one of the values in the row for that flavor: + +![yellow_triangles.png](../_images/yellow_triangles.png) + +To solve this issue, choose a flavor that supports your chosen source instead. In the image above, *vm.a6000.4* is not available but, say, *hm.large* is. + +Another possible cause might be that your quota is too low for creating a VM with your chosen flavor. You can see your quota in the **Compute -> Overview** section of your Horizon dashboard. If that is the case, you can either: + +* choose a different flavor or +* contact the CloudFerro Cloud Support to request quota increase - [Helpdesk and Support](../accountmanagement/Help-Desk-And-Support.html). + +Click **Next** or click **Networks** to define networks. + +Step 4 Define networks for the virtual machine[](#step-4-define-networks-for-the-virtual-machine "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +You should now see a window to choose one or several networks that you want your VM to work with: + +![create-linux-linux-08_creodias.png](../_images/create-linux-linux-08_creodias.png) + +Here you can select networks that will be attached to your virtual machine. They control the way your machine is connected to the Internet, to the other machines and to other resources as well. + +By default, you should have access to the network whose name starts with **cloud\_**. It + +> * connects your machines together and +> * has access to the **external** network, which gives the instance access to the Internet. + +Other networks may be present in the system. + +These were the obligatory options. Since you want to access the instance through an SSH connection, you will need to define **Security Groups** and **Key Pair**. + +Step 5 Define security groups for VM[](#step-5-define-security-groups-for-vm "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Security groups control network traffic to and from your virtual machine. + +Click **Security Groups**. You should see the following form: + +![create-linux-linux-09_creodias.png](../_images/create-linux-linux-09_creodias.png) + +By default, you have access to two groups: + +> * **default** which blocks all incoming traffic and allows all outgoing traffic +> * **allow\_ping\_ssh\_icmp\_rdp** which allows incoming Ping, SSH, ICMP and RDP connections + +Enable both of these rules. One of the open ports in **allow\_ping\_ssh\_icmp\_rdp** is 22, which is a prerequisite for SSH access. + +Step 6 Create a key pair for SSH access[](#step-6-create-a-key-pair-for-ssh-access "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +To use SSH to connect your local Linux computer to the cloud Linux “computer”, you will need to provide one public and one secret key. (Keys are random strings, usually hundreds of characters long.) + +Click **Key Pair**. You should now see the following window: + +![create-linux-linux-10_creodias.png](../_images/create-linux-linux-10_creodias.png) + +In the image above, the key is called **test-key**. There are three ways to enter the keys into this window: + +> * using option **Create Key Pair** – create it on the spot, +> * using option **Import Key Pair** – take the keys you already have and upload them to the cloud, +> * using one of the key pairs that were already existing within OpenStack cloud. + +If you haven’t created your key pair yet, please follow Prerequisite No. 5. + +Anyways, make sure that your uploaded key is in the **Allocated** section. + +Step 7 Create the instance[](#step-7-create-the-instance "Permalink to this headline") +--------------------------------------------------------------------------------------- + +Once you have set everything up, click **Launch Instance**. + +Your instance should now be in the **Instances** list. Initially, the instance will be in a state of “Spawning” as in this image: + +![create-linux-linux-12_creodias.png](../_images/create-linux-linux-12_creodias.png) + +Spawning is the process of preparing the instance. + +Wait up to a few minutes until your instance has finished spawning. The next state is **Running** label in the **Power State** column: + +![create-linux-linux-13_creodias.png](../_images/create-linux-linux-13_creodias.png) + +It means that the instance is ready to use. + +In Step 4 you have attached a network with the name that starts with **cloud\_**. It allows the instance to send and receive data from other instances in the cloud and the Internet but does not automatically provide a static IP address. Such address is important if you want to host a website or access the instance via the SSH protocol. + +Just like on the above screenshot, under header **IP Address**, you will see network addresses which both start with **10.**. It means that they are local network addresses. If you want to access your instance remotely, it must have a static IP address. The way to add it is to attach a so-called *floating IP* address to the instance. + +Step 8 Attach a Floating IP to the instance[](#step-8-attach-a-floating-ip-to-the-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +Here is how to create and attach a floating IP to your instance: [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html). + +Once you have added the floating IP, you will see it in the Horizon dashboard under header **IP Address** - just like in the last image from that article: + +![ip_address_from_article.png](../_images/ip_address_from_article.png) + +The floating IP address in that article is **64.225.132.0**. Your address will vary. + +Step 9 Convert your SSH key[](#step-9-convert-your-ssh-key "Permalink to this headline") +----------------------------------------------------------------------------------------- + +If you followed Prequisite No. 5, you should have an SSH key pair on your local computer - public and private. + +In order to connect to a virtual machine using PuTTY, you must first convert your private key to the PuTTY format. + +If you didn’t install PuTTY yet, please follow Prerequisite No. 4. You should have the following section in your **Start** menu: + +![putty-02.png](../_images/putty-02.png) + +Choose **PuTTYgen**. You should get the following window: + +![putty-03.png](../_images/putty-03.png) + +Click **Load**. A file sector should appear: + +![putty-04.png](../_images/putty-04.png) + +In the lower section of the window there should be a drop-down menu with the option **PuTTY Private Key Files** already selected. Click it and choose **All Files (\*.\*)** instead: + +![putty-05.png](../_images/putty-05.png) + +Find your downloaded private key and click **Open**. + +A following message should appear: + +![putty-06.png](../_images/putty-06.png) + +Click **OK**. You should return to the previous window (**PuTTY Key Generator**). Click **Save private key**. You should get the following question: + +![putty-07.png](../_images/putty-07.png) + +Click **Yes**. + +In the next window **Save private key as:** choose the location in which you wish to place your private key. Choose a name for your file and press **Save**. + +Close the **PuTTY Key Generator** window. Your saved file should like like this: + +![putty-08.png](../_images/putty-08.png) + +Of course, your file will probably have a different name than the one on the screenshot above. + +Step 10 Configure PuTTY[](#step-10-configure-putty "Permalink to this headline") +--------------------------------------------------------------------------------- + +Run **PuTTY** from your **Start** menu. The following window should appear: + +![putty-09.png](../_images/putty-09.png) + +In the text field **Host Name (or IP address)** type the floating IP of your virtual machine - in this example it is **64.225.133.247**: + +![putty-10.png](../_images/putty-10.png) + +In the **Category** section (in the left part of the window) go to **Connection -> SSH -> Auth -> Credentials to authenticate with**. You should get the following form: + +![putty-11.png](../_images/putty-11.png) + +Click **Browse…** next to the text field **Private key file for authentictation**. + +Choose your converted private key. + +The location of your key should appear in the **Private key file for authentication** text box: + +![key-location-putty.png](../_images/key-location-putty.png) + +Step 11 Save the session settings[](#step-11-save-the-session-settings "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +To save these settings for future use, return to the **Session** category in which you typed the floating IP of your virtual machine. Choose the name of your session and type it in the text field found in the **Load, save or delete a stored session**: + +![putty-12.png](../_images/putty-12.png) + +Click **Save**. Your saved session should appear on the list: + +![putty-13.png](../_images/putty-13.png) + +Step 12 Connect to your virtual machine[](#step-12-connect-to-your-virtual-machine "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +To connect to your virtual machine, click **Open**. If you are connecting to that machine for the first time, you should receive the following alert: + +![putty-14.png](../_images/putty-14.png) + +Click **Accept**. + +You will be asked for your username: + +![putty-15.png](../_images/putty-15.png) + +Type **eouser** and press Enter. + +Note + +User **eouser** is the predefined Linux user name on default images on CloudFerro Cloud hosting. + +You should now be connected to your virtual machine and be able to execute commands: + +![putty-16.png](../_images/putty-16.png) + +Using your saved PuTTY session to simplify login[](#using-your-saved-putty-session-to-simplify-login "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +In order to use your saved session, open **PuTTY**. In the **Load, save or delete a stored session**, click the name of your saved session from the list and click **Load**. + +All your settings, including the floating IP of your VM should now be provided: + +![putty-13.png](../_images/putty-13.png) + +You can now start your session as explained in Step 12 above. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +CloudFerro Cloud cloud can be used for general hosting needs, such as + +> * installing LAMP servers, +> * installing and using WordPress servers, +> * email servers, +> * Kubernetes and SLURM clusters and so on. + +To create a *cluster* of instances, see the series of articles on Kubernetes: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](../kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +If you find yourself unable to connect to your virtual machine using SSH, you can use the web console for troubleshooting and other purposes. Here’s how to do it: + +[How to access the VM from OpenStack console on CloudFerro Cloud](How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html) + +If you don’t want the storage of your instance to be deleted while the VM is removed, you can choose to use a volume during instance creation. Please see the following articles: + +[VM created with option Create New Volume No on CloudFerro Cloud](VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html) + +[VM created with option Create New Volume Yes on CloudFerro Cloud](VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html). + +You can’t apply the SSH keys uploaded to the Horizon dashboard directly to a VM after its creation. The following article presents a walkaround to this problem: + +[How to add SSH key from Horizon web console on CloudFerro Cloud](../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html). + +If you find that the storage of your VM is insufficient for your needs, you can attach the volume to it after its creation. The following articles contain appropriate instructions: [How to attach a volume to VM less than 2TB on Linux on CloudFerro Cloud](../datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html) and [How to attach a volume to VM more than 2TB on Linux on CloudFerro Cloud](../datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html.md b/docs/cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html.md new file mode 100644 index 0000000..80f3eec --- /dev/null +++ b/docs/cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html.md @@ -0,0 +1,72 @@ +How to create a VM using the OpenStack CLI client on CloudFerro Cloud cloud[](#how-to-create-a-vm-using-the-openstack-cli-client-on-brand-name-cloud "Permalink to this headline") +=================================================================================================================================================================================== + +This article will cover creating a virtual machine on CloudFerro Cloud cloud using the OpenStack CLI client exclusively. It contains basic information to get you started. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * The **openstack** command to create a VM +> * Selecting parameters of the new virtual machine +> +> > * Image +> > * Flavor +> > * Key pair +> > * Network(s) +> > * Security group(s) +> +> * Creating a virtual machine with CLI only +> * Adding a floating IP to the existing VM +> * Using SSH to access the VM + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **OpenStack CLI client configured** + +To have the OpenStack CLI client configured and operational, see article: [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html). + +If the command + +``` +openstack flavor list + +``` + +shows a list of flavors, the **openstack** command is operational. + +No. 3 **Available image to create a new VM from** + +In general, you can create a new virtual machine from these four sources: + +> * operating system image +> * instance snapshot +> * volume +> * volume snapshot + +In this article, we will use the first option, an operating system image, as a source of a new virtual machine. There are three ways you can obtain an image: + +Images that are automatically included on CloudFerro Cloud cloud +: There is a set of images that come predefined with the cloud. Typically, that default list of images will contain Ubuntu, CentOS, and Windows 2019/22 images, with various flavors. Other default images could be available as well, say, for AlmaLinux, OPNSense, OSGeolive, Rocky Linux and so on. + +Images shared from other projects +: Under OpenStack, images can be shared between the projects. To have an alien image available in your project, you have to accept it first. + +Images uploaded within your account +: Finally, you can upload an image by yourself. Once uploaded, the image will be a first class citizen but it may not be automatically available on other accounts you might have. + + See this article + + [How to upload your custom image using OpenStack CLI on CloudFerro Cloud](How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html) + + for an example of uploading a new Debian image to the cloud. + +No. 4 **Available SSH key pair** + +These two articles should help generate and import the SSH key into the cloud: + +* /networking/Generating-a-sshkeypair-in-Linux-on-CloudFerro-Cloud and \ No newline at end of file diff --git a/docs/cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..52f7e3e --- /dev/null +++ b/docs/cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,62 @@ +How to create instance snapshot using Horizon on CloudFerro Cloud[](#how-to-create-instance-snapshot-using-horizon-on-brand-name "Permalink to this headline") +=============================================================================================================================================================== + +In this article, you will learn how to create instance snapshot on CloudFerro Cloud cloud, using Horizon dashboard. + +Instance snapshots allow you to archive the state of the virtual machine. You can, then, use them for + +> * backup, +> * migration between clouds +> * disaster recovery and/or +> * cloning environments for testing or development. + +We cover both types of storage for instances, *ephemeral* and *persistent*. + +The plan[](#the-plan "Permalink to this headline") +--------------------------------------------------- + +In reality, you will be using the procedures described in this article with the already existing instances. + +However, to get a clear grasp of the process, while following this article you are going to create two new instances, one with *ephemeral* and the other with *persistent* type of storage. Let their names be **instance-which-uses-ephemeral** and **instance-which-uses-volume**. You will create an instance snapshot for each of them. + +If you are only interested in one of these types of instances, you can follow its respective section of this text. + +It goes without saying that after following a section about one type of virtual machine you can clean up the resources you created to, say, save costs. + +Or you can keep them and use them to create an instance out of it using one of articles mentioned in What To Do Next. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Create snapshot of instance which uses ephemeral storage +> +> + Navigate to the list of instances in Horizon +> + Shut down the VM +> + Create a snapshot +> + Show what the snapshot will contain for ephemeral storage +> * Create snapshot of instance which uses persistent storage +> +> + Navigate to the list of instances in Horizon +> + Shut down the VM +> + Create a snapshot +> + What does creating a snapshot of instance with persistent storage do? +> + Exploring instance snapshot and volume snapshots which were created alongside it +> + What happens if there are multiple volumes? +> * Downloading an instance snapshot + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Ephemeral storage vs. persistent storage** + +Please see article [Ephemeral vs Persistent storage option Create New Volume on CloudFerro Cloud](../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html) to understand the basic difference between ephemeral and persistent types of storage in OpenStack. + +No. 3 **Instance with ephemeral storage** + +You need a virtual machine hosted on CloudFerro Cloud cloud. + +Using any of the following articles will produce an instance with ephemeral storage: \ No newline at end of file diff --git a/docs/cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..15ffce5 --- /dev/null +++ b/docs/cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html.md @@ -0,0 +1,37 @@ +How to create key pair in OpenStack Dashboard on CloudFerro Cloud[](#how-to-create-key-pair-in-openstack-dashboard-on-brand-name "Permalink to this headline") +=============================================================================================================================================================== + +Open **Compute -> Key Pairs** + +![keypair1.png](../_images/keypair1.png) + +Click **Create Key Pair**, insert the name of the key (eg. “ssh-key”) and Key Type. + +![keypair2.png](../_images/keypair2.png) + +After generating Key Pair your new Private Key download window will appear. Click **Open with Text Editor** + +![keypair3.png](../_images/keypair3.png) + +![keypair4.png](../_images/keypair4.png) + +Save the key as **“id\_rsa”** in the folder of your choice (in linux the keys are usually kept in **~./ssh** folder). + +In case of linux you should change the permissions on the private key: + +``` +$ sudo chmod 600 id_rsa + +``` + +![keypair5.png](../_images/keypair5.png) + +Click key name in **Key Pairs** menu and read your **public key**. You can also save the key to a file like the private key. For example named **“id\_rsa.pub”**. + +* To connect via SSH to your Virtual Machine using Linux, follow the steps in this FAQ: + +[How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud](../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html) + +* To connect via SSH to your Virtual Machine using Windows (Command Prompt), follow the steps in this FAQ: + +[How to connect to a virtual machine via SSH from Windows 10 Command Prompt on CloudFerro Cloud](../windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..272742b --- /dev/null +++ b/docs/cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,64 @@ +How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud[](#how-to-create-new-linux-vm-in-openstack-dashboard-horizon-on-brand-name "Permalink to this headline") +======================================================================================================================================================================================= + +Go to **Project → Compute → Instances**. + +![newvm1.png](../_images/newvm1.png) + +Click **“Launch Instance”**. + +Insert the name of the Instance (eg. “vm01”) and click Next button. + +![newvm2.png](../_images/newvm2.png) + +Select Instance Boot Source (eg. “Image”), and choose desired image (eg. “Ubuntu 20.04 LTS”) by clicking on arrow. + +Note + +If you do not need to have the system disk bigger than the size defined in a chosen flavor, we recommend setting “Create New Volume” feature to “No” state. + +![newvm3.png](../_images/newvm3.png) + +Choose Flavor (eg. eo1.xsmall). + +![newvm4.png](../_images/newvm4.png) + +Click **“Networks”** and then choose desired networks. + +![newvm5.png](../_images/newvm5.png) + +Open **“Security Groups”** After that, choose “default” and “allow\_ping\_ssh\_icmp\_rdp” groups. + +![newvm6.png](../_images/newvm6.png) + +Choose or generate SSH keypair [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html) for your VM. Next, launch your instance by clicking on blue button. + +![newvm7.png](../_images/newvm7.png) + +You will see **“Instances”** menu with your newly created VM. + +![newvm8.png](../_images/newvm8.png) + +Open the drop-down menu and choose **“Console”**. + +![newvm9.png](../_images/newvm9.png) + +Fig. 2 Click on the black terminal area (to activate access to the console). Type: **eoconsole** and hit Enter.[](#id1 "Permalink to this image") + +![newvm10.png](../_images/newvm10.png) + +Insert and retype new password. + +![newvm11.png](../_images/newvm11.png) + +Now you can type commands. + +![newvm12.png](../_images/newvm12.png) + +After you finish, type “exit”. + +![newvm13.png](../_images/newvm13.png) + +This will close the session. + +If you want to make your VM accessible from the Internet check [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/cloud/How-to-fix-unresponsive-console-issue-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-fix-unresponsive-console-issue-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..2cb199d --- /dev/null +++ b/docs/cloud/How-to-fix-unresponsive-console-issue-on-CloudFerro-Cloud.html.md @@ -0,0 +1,19 @@ +How to fix unresponsive console issue on CloudFerro Cloud[](#how-to-fix-unresponsive-console-issue-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +When you create a new virtual machine, the first thing you might want to do is to have a look at the console panel and check whether the instance has booted correctly. + +After opening up the console in OpenStack you might encounter this error: + +* unresponsive grey screen +* document icon in the down-right corner which informs about the issue on client side + +![fixconsole.png](../_images/fixconsole.png) + +**In this case:** + +Check your firewall rules for port 6082 and assign “incoming” traffic the “allow” rule. + +**Connecting through RDP:** + +Make sure that you included your floating IP in RDP rules on your computer. If you want to make these changes for more than one machine, then include our external network address: 185.178.84.0/22. \ No newline at end of file diff --git a/docs/cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..0adad99 --- /dev/null +++ b/docs/cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html.md @@ -0,0 +1,24 @@ +How to generate and manage EC2 credentials on CloudFerro Cloud[](#how-to-generate-and-manage-ec2-credentials-on-brand-name "Permalink to this headline") +========================================================================================================================================================= + +EC2 credentials are used for accessing private S3 buckets on CloudFerro Cloud cloud. This article covers how to generate and manage a pair of EC2 credentials so that you will be able to mount those buckets both + +> * on your virtual machines and +> * on your local computers. + +Warning + +A pair of EC2 credentials usually provides access to secret data so share it only with trusted individuals. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with access to Horizon interface: + +No. 2 **OpenStack CLI client installed and configured** + +You need to have the OpenStack CLI operational. + +First, it must be installed. You have several options, such as: \ No newline at end of file diff --git a/docs/cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..eee14de --- /dev/null +++ b/docs/cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,306 @@ +How to generate or use Application Credentials via CLI on CloudFerro Cloud[](#how-to-generate-or-use-application-credentials-via-cli-on-brand-name "Permalink to this headline") +================================================================================================================================================================================= + +You can authenticate your applications to *keystone* by creating application credentials for them. It is also possible to delegate a subset of role assignments on a project to an application credential, granting the same or restricted authorization to a project for the app. + +With application credentials, apps authenticate with the “application credential ID” and a “secret” string which is not the user’s password. Thanks to this, the user’s password is not embedded in the application’s configuration, which is especially important for users whose identities are managed by an external system such as LDAP or a single sign-on system. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Authenticate** + +Once you have installed this piece of software, you need to authenticate to start using it: [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html) + +No. 3 **OpenStackClient installed and available** + +OpenStack is written in Python, it is recommended to use a dedicated virtual environment for the rest of this article. + +Install GitBash on Windows +: [How to install OpenStackClient GitBash for Windows on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html). + +Install and run WSL (Linux under Windows) +: [How to install OpenStackClient on Windows using Windows Subsystem for Linux on CloudFerro Cloud OpenStack Hosting](../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html). + +Install OpenStackClient on Linux +: [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html). + +No. 4 **jq installed and running** + +You will need to have [jq](https://jqlang.org/download/) up and running. On Ubuntu, for example, the commands would be: + +``` +apt update && apt upgrade -y # Get the latest packages list and upgrade installed packages +apt install jq -y # Install jq from the default Ubuntu repository +jq --version # Check the installed jq version + +``` + +Step 1 CLI Commands for Application Credentials[](#step-1-cli-commands-for-application-credentials "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +Command + +``` +openstack application credential + +``` + +will list four commands available: + +``` +application credential create +application credential delete +application credential list +application credential show + +``` + +To see the parameters for these commands, end them with **--help**, like this: + +``` +openstack application credential create --help + +``` + +Amongst dozens of lines describing all the possible parameters, of particular interest are the commands to create a new credential: + +![credential_create_help.png](../_images/credential_create_help.png) + +Note + +The **--help** option will produce a *vim*-like output, so type **q** on the keyboard to get back to the usual terminal line. + +Step 2 The Simplest Way to Create a New Application Credential[](#step-2-the-simplest-way-to-create-a-new-application-credential "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------- + +The simplest way to generate a new application credential is just to define the name – the rest of the parameters will be defined automatically for you. The following command uses name **cred2**: + +``` +openstack application credential create cred2 + +``` + +The new application credential will be both formed and shown on the screen: + +![create_new_with_name.png](../_images/create_new_with_name.png) + +Step 3 Using All Parameters to Create a New Application Credential[](#step-3-using-all-parameters-to-create-a-new-application-credential "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Here is the meaning of related parameters: + +**--secret** + +Secret value to use for authentication. If omitted, will be generated automatically. + +**--role** + +Roles to authorize. If not specified, roles for the current user are all copied. Repeat this parameter to specify another role to become part of the credential. The example of roles is: + +``` +_member_ magnum_user load-balancer_member heat_stack_owner creator k8s_admin + +``` + +Note + +Role **\_member\_** is the most basic role and should always be present. Beware however, as in some variations of OpenStack it can be called **member** instead of **\_member\_**. + +**--expiration** + +Sets an expiration date. If not present, the application credential will not expire. The format is **YYYY-mm-ddTHH:MM:SS**, for instance: + +``` +--expiration $(date +"%Y-11-%dT%H:%M:%S") + +``` + +That will yield the following date: + +``` +2022-11-09T13:27:01.000000 + +``` + +Parameters **--unrestricted** and **--restricted** + +By default, for security reasons, application credentials are forbidden from being used for creating additional application credentials or keystone trusts. If your application needs to be able to perform these actions, use parameter **--unrestricted**. + +Here is a complete example, using all of the available parameters to create a new application credential: + +``` +openstack application credential create foo-dev-member4 --role _member_ --expiration $(date +"%Y-11-%dT%H:%M:%S") --description "Test application credentials" --unrestricted -c id -c secret -f json | jq -r '"application_credential_id: \"" + .id + "\"", "application_credential_secret: \"" + .secret + "\""' + +``` + +The result is: + +![complete_example.png](../_images/complete_example.png) + +The name of the new application credential will be **foo-dev-member4**, will be used by role **\_member\_** and so on. The part of the command starting with **| jq -r** prints only the values of credentials **id** and **secret** as you have to enter those value into the *clouds.yml* file in order to activate the recognition part of the process. + +Step 4 Enter id and secret into clouds.yml[](#step-4-enter-id-and-secret-into-clouds-yml "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +You are now going to store the values of **id** and **secret** that the cloud has sent to you. Once stored, future **openstack** commands will use these value to authenticate to the cloud without using any kind of password. + +The place to store *id* and *secret* is a file called *clouds.yml*. It may reside on your local computer in one of these three locations: + +Current directory +: **./clouds.yml** + + You may want to create a special folder with **mkdir** command and paste *clouds.yml* into it. + + The current directory is searched first. + +User configuration directory +: **$HOME/.config/openstack/clouds.yml** + + The most common default location for individual users. + + Searched after the current directory. + +System-wide configuration directory +: **/etc/openstack/clouds.yml** + + Searches that location as the last resort. + + Usually you must be *root* to modify that file. + +The first *clouds.yml* file that is found will be used. + +Note + +The contents of the *clouds.yml* file will be in *yaml* format. It is customary to have the extension of *yaml* content be the exact same word *yaml* but here it is not *yaml* – it is **yml** instead. + +Let us create a new application credential called *trial-member\_creatornew*. + +``` +openstack application credential create trial-member_creatornew --unrestricted -c id -c secret -f json | jq -r '"application_credential_id: \"" + .id + "\"", "application_credential_secret: \"" + .secret + "\""' + +``` + +This is the result: + +![create_credential.png](../_images/create_credential.png) + +Now create the *clouds.yml* file using your preferred editor of choice. Here it is *nano*: + +``` +nano $HOME/.config/openstack/clouds.yml + +``` + +If not already existing, *nano* will create that file anew. Here are its contents: + +**clouds.yml** + +``` +clouds: + trial-member_creatornew: + auth_type: "v3applicationcredential" + auth: + auth_url: https://keystone.cloudferro.com:5000/v3 + application_credential_id: "a582edb593644106baeaa75fd706feb2" + application_credential_secret: "mPKQort71xi7Ros7BHb1sG4753wvN_tmJMBd1aRBBGzgFZM7AoUkLWzCutQuh-dAyac86-rkikYqqYaT1_f0hA" + +``` + +Let us dissect that file line by line: + +> * **clouds:** is in plural as it is possible to define parameters of two or more clouds in the same file. +> * **trial-member\_creatornew** is the name of the application credential used in the previous *credential create* command. +> * **v3applicationcredential** is the type of auth connection (it is always the same) +> * **auth** start of *auth* parameters +> * **auth\_url** the address to call on the CloudFerro Cloud OpenStack server (it always the same) +> * **application\_credential\_id** the value from the previous call of *credential create* command +> * **credential create** command the value from the previous call of *credential create* command + +This is how it should look in the editor: + +![nano_values.png](../_images/nano_values.png) + +Save it with **Ctrl**-**X**, then press **Y** and Enter. + +Step 5 Gain access to the cloud by specifying OS\_CLOUD or --os-cloud[](#step-5-gain-access-to-the-cloud-by-specifying-os-cloud-or-os-cloud "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Application credentials give access to all of the activated regions and you have to specify which one to use. Specify it as a value of parameter **--os-region**, for instance, WAW3-2, WAW4-1 (or what else have you). + +In previous step you defined a *clouds.yml* file and it used to start with **clouds:**. The next line defined to which cloud will the parameters refer to, here it was *trial-member\_creatornew*. By design, the *clouds.yml* file can contain information on several clouds – not only one – so it is necessary to distinguish to which cloud are you going to refer. There is a special parameter for that, called + +> * **OS\_CLOUD** if used as systems parameter or +> * **--os-cloud** if used from the command line. + +You define **OS\_CLOUD** by directly assigning its value from the command line: + +``` +export OS_CLOUD=trial-member_creatornew +echo $OS_CLOUD + +``` + +Open a new terminal window, execute the command above and then try to access the server: + +![export_os_cloud.png](../_images/export_os_cloud.png) + +It works. + +You can also use that parameter in the command line, like this: + +``` +openstack --os-cloud=trial-member_creatornew flavor list + +``` + +It works as well: + +![cli_os_cloud.png](../_images/cli_os_cloud.png) + +You have to set up **OS\_CLOUD** once per opening a new terminal window and then you can use **openstack** command without interpolating **--os-cloud** parameter all the time. + +If you had two or more clouds defined in the *clouds.yml* file, then using **--os-cloud** in the command line would be more flexible. + +In both cases, you can access the cloud without specifying the password, which was the goal in the first place. + +Environment variable-based storage[](#environment-variable-based-storage "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +You can export them as environment variables. This increases security, especially in virtual machines. Also, automation tools can use them dynamically. + +To set them for the current session: + +``` +export OS_CLOUD=mycloud +export OS_CLIENT_ID= +export OS_CLIENT_SECRET= + +``` + +To make them persistent, add these lines to your **~/.bashrc** or **~/.zshrc** file: + +``` +echo 'export OS_CLOUD=mycloud' >> ~/.bashrc +echo 'export OS_CLIENT_ID=' >> ~/.bashrc +echo 'export OS_CLIENT_SECRET=' >> ~/.bashrc +source ~/.bashrc + +``` + +This method is useful for scripted deployments, temporary sessions, and when you don’t want credentials stored in files. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Here are some articles that use application credentials: + +[How to install Rancher RKE2 Kubernetes on CloudFerro Cloud](../kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html) + +[Configuring IP Whitelisting for OpenStack Load Balancer using Terraform on CloudFerro Cloud](../kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html) + +[OpenStack User Roles on CloudFerro Cloud](OpenStack-user-roles-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..fd2cc62 --- /dev/null +++ b/docs/cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html.md @@ -0,0 +1,166 @@ +How to install Python virtualenv or virtualenvwrapper on CloudFerro Cloud[](#how-to-install-python-virtualenv-or-virtualenvwrapper-on-brand-name "Permalink to this headline") +=============================================================================================================================================================================== + +Virtualenv is a tool with which you are able to create isolated Python environments. It is mainly used to get rid of problems with dependencies and versions. +It also does not include permission setup. Generally virtualenvwrapper is a kind of extension for virtualenv. It owns wrappers which are in charge of creating and deleting environments. It is useful supplement for our current subject. + +For purposes of this guide we will use virtual machine **vm01** with operating system **Ubuntu 22.04 LTS**. + +Log in to your virtual machine and check python version (it should be preinstalled). Next step would be the installation of pip: + +``` +eouser@vm01:~$ python3 --version + +Python 3.10.12 + +eouser@vm01:~$ sudo apt install python3-pip + +``` + +Confirm the pip3 installation by invoking: + +``` +eouser@vm01:~$ pip3 -V + +``` + +If pip3 is installed, the **pip3 -V** command should give the output similar to this: + +``` +pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10) + +``` + +Install virtualenvwrapper via pip: + +``` +eouser@vm01:~$ pip3 install virtualenvwrapper + +``` + +Create a new directory to store your virtual environments, for example: + +``` +mkdir .virtualenvs + +``` + +Now we are going to modify **.bashrc** file by adding a row that will adjust every new virtual environment to use Python 3. +We will point virtual environments to the directory we created above (.virtualenvs) and we will also point to the locations of the virtualenv and virtualenvwrapper. +Open .bashrc file using editor, for example: + +``` +vim ~/.bashrc + +``` + +Navigate to the bottom of the .bashrc file and add following rows: + +``` +#virtualenvwrapper settings: +export WORKON_HOME=$HOME/.virtualenvs +export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 +export VIRTUALENVWRAPPER_VIRTUALENV=/home/eouser/.local/bin/virtualenv +source ./.local/bin/virtualenvwrapper.sh + +``` + +After that save the .bashrc file. + +Now we have to reload the bashrc script, to do it execute the command: + +``` +source ~/.bashrc + +``` + +If everything is set up properly, you should see following lines: + +``` +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/premkproject +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/postmkproject +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/initialize +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/premkvirtualenv +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/postmkvirtualenv +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/prermvirtualenv +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/postrmvirtualenv +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/predeactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/postdeactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/preactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/postactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/get_env_details + +``` + +Now create your first virtual environment **‘test’** with ‘mkvirtualenv’ command: + +``` +mkvirtualenv test + +``` + +The output should look like this: + +``` +created virtual environment CPython3.10.12.final.0-64 in 207ms + creator CPython3Posix(dest=/home/eouser/.virtualenvs/test, clear=False, no_vcs_ignore=False, global=False) + seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/eouser/.local/share/virtualenv) + added seed packages: pip==23.2.1, setuptools==68.2.0, wheel==0.41.2 + activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/test/bin/predeactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/test/bin/postdeactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/test/bin/preactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/test/bin/postactivate +virtualenvwrapper.user_scripts creating /home/eouser/.virtualenvs/test/bin/get_env_details + +``` + +Now you should see name of your environment in the parenthesis before username, which means that you’re working on your virtual environment. + +``` +(test) eouser@vm01:~$ + +``` + +If you would like to exit current environment, just type the ‘deactivate’ command: + +``` +(test) eouser@vm01:~$ deactivate +eouser@vm01:~$ + +``` + +To start working on virtual environment type ‘workon’ command: + +``` +eouser@vm01:~$ workon test +(test) eouser@vm01:~$ + +``` + +To remove virtual environment invoke ‘rmvirtualenv’: + +``` +eouser@vm01:~$ rmvirtualenv test +Removing test... + +``` + +To list all virtual environments use ‘workon’ or ‘lsvirtualenv’: + +``` +eouser@vm01:~$ workon +test-1 +test-2 +test-3 +eouser@vm01:~$ lsvirtualenv +test-1 +====== + +test-2 +====== + +test-3 +====== + +``` \ No newline at end of file diff --git a/docs/cloud/How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..37c71aa --- /dev/null +++ b/docs/cloud/How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html.md @@ -0,0 +1,73 @@ +How to start a VM from a snapshot on CloudFerro Cloud[](#how-to-start-a-vm-from-a-snapshot-on-brand-name "Permalink to this headline") +======================================================================================================================================= + +a) Volume Snapshot[](#a-volume-snapshot "Permalink to this headline") +---------------------------------------------------------------------- + +1. Choose the desired virtual machine (booted from Volume) and click on the “Create snapshot” button. + +![snap00.png](../_images/snap00.png) + +2. Name the snapshot. The decision is up to you to improve the personal navigation throughout image or volume snapshot repository. Confirm with the blue button. + +![snap01.png](../_images/snap01.png) + +3. Go to Volumes tab and press Snapshots. + +![snap3.png](../_images/snap3.png) + +4. Your volume snapshot is being stored in this place. To start a virtual machine from this type of snapshot, press on the arrow beside “Create Volume”. + +![snap4.png](../_images/snap4.png) + +5. Choose “Launch as Instance”. + +![snap5.png](../_images/snap5.png) + +6. Define Instance name and change bookmark to “Source”. + +![snap6.png](../_images/snap6.png) + +7. Set Boot Source on “Volume Snapshot” and assign previously created snapshot by clicking on the arrow. + +![snap7.png](../_images/snap7.png) + +8. The rest of procedure is the same: [How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud](How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html). + +9. Newly created machine is visible in the Instances list. + +![snap8.png](../_images/snap8.png) + +b) Image Snapshot[](#b-image-snapshot "Permalink to this headline") +-------------------------------------------------------------------- + +1.Choose the desired virtual machine (booted from Glance image) and click on the “Create snapshot” button. + +![snap1.png](../_images/snap1.png) + +2. Name the snapshot. The decision is up to you to improve the personal navigation throughout image or volume snapshot repository. Confirm with the blue button. + +![snap2.png](../_images/snap2.png) + +3. Go to Compute tab and press Images. + +![snap3.png](../_images/snap3.png) + +4. Scroll down and find your snapshot. Click on the “Launch”. + +![snap4.png](../_images/snap4.png) + +Attention + +Image snapshot is in RAW format and its size is equivalent to the image that VM was booted from. +In the “Images” you may also find symbolic links to the volume snapshots.(i.e. snapshot-virtual-machine-01 from a) scenario). This type of snapshot is in format QCOW2 and its size is set on 0 bytes. + +5. Name your virtual machine and go to “Source.” Set Boot Source on “Instance snapshot” and choose previously created Snapshot in RAW format. + +![snap5.png](../_images/snap5.png) + +6. The rest of procedure is the same: [How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud](How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html). + +7. Virtual machine has been created. + +![snap6.png](../_images/snap6.png) \ No newline at end of file diff --git a/docs/cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e268ce5 --- /dev/null +++ b/docs/cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md @@ -0,0 +1,23 @@ +How to start a VM from instance snapshot using Horizon dashboard on CloudFerro Cloud[](#how-to-start-a-vm-from-instance-snapshot-using-horizon-dashboard-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================================== + +In this article, you will learn how to create a virtual machine from an instance snapshot using Horizon dashboard. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Ephemeral storage vs. persistent storage** + +Please see article [Ephemeral vs Persistent storage option Create New Volume on CloudFerro Cloud](../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html) to understand the basic difference between ephemeral and persistent types of storage in OpenStack. + +No. 3 **Instance snapshot** + +You need to have an instance snapshot from which you are going to create your virtual machine. In this article, we will use an exemplary snapshot named **my-instance-snapshot** - here is how it can look like in section **Images -> Images** of the Horizon dashboard: + +![start_vm_instance_snapshot_horizon-09_creodias.png](../_images/start_vm_instance_snapshot_horizon-09_creodias.png) + +The following articles contain information how to create such a snapshot: \ No newline at end of file diff --git a/docs/cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..62d88cf --- /dev/null +++ b/docs/cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html.md @@ -0,0 +1,146 @@ +How to transfer volumes between domains and projects using Horizon dashboard on CloudFerro Cloud[](#how-to-transfer-volumes-between-domains-and-projects-using-horizon-dashboard-on-brand-name "Permalink to this headline") +============================================================================================================================================================================================================================= + +Volumes in OpenStack can be used to store data. They are visible to virtual machines like drives. + +Such a volume is usually available to just the project in which it was created. Transferring data stored on it between projects might take a long time, especially if such a volume contains lots of data, like, say, hundreds or thousands of gigabytes (or even more). + +This article covers changing the assignment of a volume to a project. This allows you to move a volume directly from one project (which we will call *source* project) to another (which we will call *destination* project) using the Horizon dashboard in a way that does **not** require you to physically transfer the data. + +The *source* project and *destination* project must both be on the same cloud (for example WAW3-2). They can (but don’t have to) belong to different users from different domains and organizations. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Initializing transfer of volume +> * Accepting transfer of volume +> * Cancelling transfer of volume + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: + +No. 2 **Volume** + +You need to have a volume which you want to migrate. + +Such a volume must **not** be connected to a virtual machine. It must have the following **Status**: **Available**. + +You can check the status of your volume in the **Volumes -> Volumes** section of the Horizon dashboard. On screenshot below, that **Status** is marked with a green rectangle. + +![transfer-volume-between-projects-horizon-32_creodias.png](../_images/transfer-volume-between-projects-horizon-32_creodias.png) + +The following article includes information how to disconnect a volume from a virtual machine: [How to move data volume between two VMs using OpenStack Horizon on CloudFerro Cloud](../datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html) + +No. 4 **Ability to perform operations on both the source project and the destination project** + +For the transfer to be successful, you need to first initiate it from the *source* project and then accept it from the *source* project. + +If *source* and/or *destination* is not managed by you, you might need to get appropriate permission to perform such an operation. + +To access each of these projects directly (if possible), depending on the circumstances you can either login to appropriate account or use the project switcher found in the top of the Horizon dashboard: + +![transfer-volume-between-projects-horizon-37_creodias.png](../_images/transfer-volume-between-projects-horizon-37_creodias.png) + +If you don’t have direct access to any of these projects, you probably can request their members to execute commands mentioned in this article. + +Step 1: Initializing transfer of volume[](#step-1-initializing-transfer-of-volume "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------- + +Perform this step in the *source* project. + +Navigate to the section **Volumes -> Volumes** of the Horizon dashboard. Confirm if the volume which you want to migrate has the following **Status**: **Available**. In example below, this requirement is met - see value marked with a blue rectangle. + +![transfer-volume-between-projects-horizon-33_creodias.png](../_images/transfer-volume-between-projects-horizon-33_creodias.png) + +If your volume has a different status, do **not** continue this workflow and check Prerequisite No. 2. + +In the row which represents the volume you want to migrate, from drop-down menu found in **Actions** column choose **Create Transfer**: + +![transfer-volume-between-projects-horizon-15_creodias.png](../_images/transfer-volume-between-projects-horizon-15_creodias.png) + +You should see the following window: + +![transfer-volume-between-projects-horizon-16_creodias.png](../_images/transfer-volume-between-projects-horizon-16_creodias.png) + +Enter a descriptive name to text field **Transfer Name** and click **Create Volume Transfer**. + +You should now see the following window: + +![transfer-volume-between-projects-horizon-17_creodias.png](../_images/transfer-volume-between-projects-horizon-17_creodias.png) + +Write somewhere down **Transfer ID** and **Authorization Key**. You can also use button **Download transfer credentials** to get these credentials as a plain text file. + +Warning + +Since these credentials allow somebody to capture the volume while the transfer is active, protect them and share them only with individuals for whom they are meant! + +Once you have done it, you can click **Close** to close the window. + +Your volume should now have the following **Status**: **Awaiting Transfer**. + +![transfer-volume-between-projects-horizon-18_creodias.png](../_images/transfer-volume-between-projects-horizon-18_creodias.png) + +Note that after initializing the transfer, the volume cannot be connected to any virtual machine until the transfer is accepted or cancelled. To learn how to cancel the transfer (if you, say, accidentally chose the wrong volume), see section **Cancelling transfer of volume** near the end of the article. + +Step 2: Accepting transfer of volume[](#step-2-accepting-transfer-of-volume "Permalink to this headline") +---------------------------------------------------------------------------------------------------------- + +Perform this step in the *source* project. + +Navigate to section **Volumes -> Volumes** of the Horizon dashboard. Click **Accept Transfer**: + +![transfer-volume-between-projects-horizon-19_creodias.png](../_images/transfer-volume-between-projects-horizon-19_creodias.png) + +You should see the following window: + +![transfer-volume-between-projects-horizon-20_creodias.png](../_images/transfer-volume-between-projects-horizon-20_creodias.png) + +Enter the **Transfer ID** and the **Authorization Key** you obtained while following Step 1 above to appropriate text fields. + +Click **Accept Volume Transfer**. + +The volume should now be visible on the list: + +![transfer-volume-between-projects-horizon-21_creodias.png](../_images/transfer-volume-between-projects-horizon-21_creodias.png) + +Cancelling transfer of volume[](#cancelling-transfer-of-volume "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +If you, say, accidentally initiated transfer for a wrong volume and nobody accepts that transfer, it can be cancelled. + +To do that, navigate to section **Volumes -> Volumes** of the Horizon dashboard: + +![transfer-volume-between-projects-horizon-21_creodias.png](../_images/transfer-volume-between-projects-horizon-21_creodias.png) + +In this example, let’s assume that we mistakenly created a transfer for volume **my-volume**. Because of that, it has the following status: **Awaiting Transfer**. Such a volume cannot be connected to an instance. + +To cancel transfer, simply click **Cancel Transfer** in the row representing your volume, column **Actions**: + +![transfer-volume-between-projects-horizon-35_creodias.png](../_images/transfer-volume-between-projects-horizon-35_creodias.png) + +You will be asked for confirmation: + +![transfer-volume-between-projects-horizon-36_creodias.png](../_images/transfer-volume-between-projects-horizon-36_creodias.png) + +Click **Cancel Transfer**. + +If the operation was successful, you should get the following message in the top right corner of the Horizon dashboard: + +![transfer-volume-between-projects-horizon-38_creodias.png](../_images/transfer-volume-between-projects-horizon-38_creodias.png) + +Note that this message might be confusing if you read only its first line. It does not tell about the removal of the volume, but about cancelling of volume transfer. + +After cancelling, your volume should now once again have status **Available**: + +![transfer-volume-between-projects-horizon-11_creodias.png](../_images/transfer-volume-between-projects-horizon-11_creodias.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Now that the volume has been transferred, you might want to connect it to a virtual machine. This article includes information how to do that: [How to move data volume between two VMs using OpenStack Horizon on CloudFerro Cloud](../datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html) + +The workflow described in this article can also be done using the OpenStack CLI. Learn more here: [How to transfer volumes between domains and projects using OpenStack CLI client on CloudFerro Cloud](../openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html.md b/docs/cloud/How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html.md new file mode 100644 index 0000000..45e8771 --- /dev/null +++ b/docs/cloud/How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html.md @@ -0,0 +1,42 @@ +How to upload custom image to CloudFerro Cloud cloud using OpenStack Horizon dashboard[](#how-to-upload-custom-image-to-brand-name-cloud-using-openstack-horizon-dashboard "Permalink to this headline") +========================================================================================================================================================================================================= + +In this tutorial, you will upload custom image stored on your local computer to CloudFerro Cloud cloud, using the Horizon Dashboard. The uploaded image will be available within your project alongside default images from CloudFerro Cloud cloud and you will be able to create virtual machines using it. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to check for the presence of image in CloudFerro Cloud cloud +> * How different images might behave +> * How to upload an image using Horizon dashboard +> * Example: how to upload image for Debian 11 +> * What happens if you lose Internet connection during upload + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Custom image you wish to upload** + +You need to have the image you wish to upload. It can be one of the following image formats: + +> | | | | | | +> | --- | --- | --- | --- | --- | +> | aki | ami | ari | iso | qcow2 | +> | raw | vdi | vhd | vhdx | vmdk | + +The following container formats are supported: + +> | | | | | +> | --- | --- | --- | --- | +> | aki | ami | ari | bare | +> | docker | ova | ovf | | + +For the explanation of these formats, see article [What Image Formats are Available in OpenStack CloudFerro Cloud cloud](What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html). + +No. 3 **Uploaded public SSH key** + +If the image you wish to upload requires you to attach an SSH public key while creating the virtual machine, the key will need to be uploaded to CloudFerro Cloud cloud. One of these articles should help: \ No newline at end of file diff --git a/docs/cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..7482157 --- /dev/null +++ b/docs/cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,46 @@ +How to upload your custom image using OpenStack CLI on CloudFerro Cloud[](#how-to-upload-your-custom-image-using-openstack-cli-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================== + +In this tutorial, you will upload custom image stored on your local computer to CloudFerro Cloud cloud, using the OpenStack CLI client. The uploaded image will be available within your project alongside default images from CloudFerro Cloud cloud and you will be able to create virtual machines using it. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to check for the presence of the image in your OpenStack cloud +> * How different images might behave +> * How to upload the image using only CLI commands +> * Example: how to upload image for Debian 11 +> * What happens if you lose Internet connection during upload + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **OpenStack CLI configured** + +You need to have the OpenStack CLI client configured and operational. See [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html). You can test whether your OpenStack CLI is properly activated by executing the **openstack server list** command mentioned in the end of that article - it should return the list of your virtual machines. + +No. 3 **Custom image you wish to upload** + +You need to have the image you wish to upload. It can be one of the following image formats: + +> | | | | | | +> | --- | --- | --- | --- | --- | +> | aki | ami | ari | iso | qcow2 | +> | raw | vdi | vhd | vhdx | vmdk | + +The following container formats are supported: + +> | | | | | +> | --- | --- | --- | --- | +> | aki | ami | ari | bare | +> | docker | ova | ovf | | + +For the explanation of these formats, see article [What Image Formats are Available in OpenStack CloudFerro Cloud cloud](What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html). + +No. 4 **Uploaded public SSH key** + +If the image you wish to upload requires you to attach an SSH public key while creating the virtual machine, the key will need to be uploaded to CloudFerro Cloud cloud. One of these articles should help: \ No newline at end of file diff --git a/docs/cloud/How-to-use-Docker-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-use-Docker-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..d7a1bf3 --- /dev/null +++ b/docs/cloud/How-to-use-Docker-on-CloudFerro-Cloud.html.md @@ -0,0 +1,10 @@ +How to install and use Docker on Ubuntu 24.04[](#how-to-install-and-use-docker-on-ubuntu-24-04 "Permalink to this headline") +============================================================================================================================= + +This guide will walk you through + +* the installation of [Docker](https://www.docker.com/) on Ubuntu 24.04, and +* basic commands to get you started with Docker containers. + +What we are going to cover +-------------------------- \ No newline at end of file diff --git a/docs/cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html.md b/docs/cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html.md new file mode 100644 index 0000000..b5b5a6f --- /dev/null +++ b/docs/cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html.md @@ -0,0 +1,208 @@ +How to Use GUI in Linux VM on CloudFerro Cloud and access it From Local Linux Computer[](#how-to-use-gui-in-linux-vm-on-brand-name-and-access-it-from-local-linux-computer "Permalink to this headline") +========================================================================================================================================================================================================= + +In this article you will learn how to use GUI (graphical user interface) on a Linux virtual machine running on CloudFerro Cloud cloud. + +For this purpose, you will install and use **X2Go** on your local Linux computer. + +This article covers the installation of two desktop environments: MATE and XFCE. Choose the one that suits you best. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Installing X2Go client +> * Installing X2Go server and desktop environment (MATE or XFCE) +> * Connecting to your virtual machine using X2Go client +> * Basic troubleshooting + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Linux installed on your local computer** + +You need to have a local computer with Linux installed. This article was written for such computers running Ubuntu Desktop 22.04. If you are running a different Linux distribution, adjust the instructions from this article accordingly. + +No. 3 **Linux virtual machine** + +You need a Linux virtual machine running on CloudFerro Cloud cloud. You need to able to access it via SSH. The following article explains how to create one such virtual machine: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +This article was written for virtual machines using a default Ubuntu 20.04 image on cloud. Adjust the instructions from this article accordingly if your virtual machine has a different Linux distribution. + +Step 1: Install X2Go client[](#step-1-install-x2go-client "Permalink to this headline") +---------------------------------------------------------------------------------------- + +Open the terminal on your local Linux computer and update your packages by executing the following command: + +``` +sudo apt update && sudo apt upgrade + +``` + +Now, install the **x2goclient** package: + +``` +sudo apt install x2goclient + +``` + +Step 2: Install the desktop environment on your VM[](#step-2-install-the-desktop-environment-on-your-vm "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +### Method 1: Installing MATE[](#method-1-installing-mate "Permalink to this headline") + +Connect to your VM using SSH. Update your packages there: + +``` +sudo apt update && sudo apt upgrade + +``` + +Now, install the **MATE** desktop environment and X2Go server: + +``` +sudo apt install x2goserver ubuntu-mate-desktop mate-applet-brisk-menu + +``` + +You can add other packages to that command as needed. + +During the installation you will be asked to choose the keyboard layout. Choose the one that suits you best using the arrow keys and Enter. + +Once the installation is completed, reboot your VM by executing the following command: + +``` +sudo reboot + +``` + +### Method 2: Installing XFCE[](#method-2-installing-xfce "Permalink to this headline") + +Connect to your VM using SSH. Update your packages there: + +``` +sudo apt update && sudo apt upgrade + +``` + +Now, install the **XFCE** desktop environment, the terminal emulator and X2Go server: + +``` +sudo apt install x2goserver xfce4 xfce4-terminal + +``` + +You can add other packages to that command as needed. + +During the installation you will be asked to choose the keyboard layout. Choose the one that suits you best using the arrow keys and Enter. + +Once the installation is completed, reboot your VM by executing the following command: + +``` +sudo reboot + +``` + +Step 3: Connect to your VM using X2Go[](#step-3-connect-to-your-vm-using-x2go "Permalink to this headline") +------------------------------------------------------------------------------------------------------------ + +Open X2Go on your local Linux computer. If you haven’t configured any session yet, you should get the window used for creating one: + +![linux-gui-03_creodias.png](../_images/linux-gui-03_creodias.png) + +If you didn’t get such window, click the **New session** button on the X2Go toolbar. + +Enter the name of your choice for your session in the **Session name:** text box. In this example, the name **cloud-session** will be used. + +In the text box **Host:** enter the floating IP of your VM. + +In the **Login:** button enter **eouser**. + +Click the folder icon next to the **Use RSA/DSA key for sh connection:** text field. A file selector should appear. Choose the SSH private file you use for connecting to your VM via SSH. + +From the drop-down menu in the **Session type** section choose the desktop environment you installed, for example **MATE** or **XFCE**. + +In the **Input/Output** tab choose the screen resolution that suits you best in the **Display** section. Here you can also choose whether you wish to share clipboard with the remote VM in the **Clipboard mode** section. + +Click **OK**. The window should close. + +The session you created should now be visible in the X2Go client: + +![linux-gui-04_creodias.png](../_images/linux-gui-04_creodias.png) + +Click the name of your session to connect to your VM. Wait up to a minute until your connection is established. You should now see your desktop environment. + +If you chose MATE, it should look like this: + +![linux-gui-05_creodias.png](../_images/linux-gui-05_creodias.png) + +If you, however, chose XFCE, it should look like this: + +![linux-gui-06_creodias.png](../_images/linux-gui-06_creodias.png) + +Troubleshooting - Using the terminal emulator on XFCE[](#troubleshooting-using-the-terminal-emulator-on-xfce "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------- + +If the button **Terminal Emulator** on your taskbar does not launch your terminal, click the **Applications** menu in the upper left corner of the screen: + +![linux-gui-07_creodias.png](../_images/linux-gui-07_creodias.png) + +Choose **Settings** -> **Preferred Applications**: + +![linux-gui-08_creodias.png](../_images/linux-gui-08_creodias.png) + +You should get the following window: + +![linux-gui-09_creodias.png](../_images/linux-gui-09_creodias.png) + +Open the tab **Utilities**. The window should now look like this: + +![linux-gui-11_creodias.png](../_images/linux-gui-11_creodias.png) + +From the drop-down menu in the **Terminal Emulator** section choose **Xfce Terminal**. + +Click **Close**. + +The button should now launch the terminal emulator correctly. + +Troubleshooting - Keyboard layout[](#troubleshooting-keyboard-layout "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +If you discover that the system does not use the keyboard layout you chose during the installation of the desktop environment, you will need to set it manually. The process differs depending on the desktop environment you chose. + +### MATE[](#mate "Permalink to this headline") + +Click the **Menu** in the upper left corner of the screen: + +![linux-gui-12_creodias.png](../_images/linux-gui-12_creodias.png) + +From the **Preferences** section choose **Keyboard**: + +![linux-gui-13_creodias.png](../_images/linux-gui-13_creodias.png) + +You should get the following window: + +![linux-gui-14_creodias.png](../_images/linux-gui-14_creodias.png) + +Navigate to the **Layouts** tab: + +![linux-gui-15_creodias.png](../_images/linux-gui-15_creodias.png) + +Here, you can add or remove keyboard layouts depending on your needs. + +### XFCE[](#xfce "Permalink to this headline") + +From the **Applications** menu in the upper left corner of the screen choose **Settings** -> **Keyboard**. You should get the following window: + +![linux-gui-16_creodias.png](../_images/linux-gui-16_creodias.png) + +Go to the **Layout** tab: + +![linux-gui-17_creodias.png](../_images/linux-gui-17_creodias.png) + +Unselect the **Use system defaults** check box. You can now add or remove the keyboard layouts depending on your needs. \ No newline at end of file diff --git a/docs/cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html.md b/docs/cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..1407da7 --- /dev/null +++ b/docs/cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,120 @@ +How to use Security Groups in Horizon on CloudFerro Cloud[](#how-to-use-security-groups-in-horizon-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +Security groups in **OpenStack** are used to filter the Internet traffic coming **to** and **from** your virtual machines. They consist of security rules and can be attached to your virtual machines during and after the creation of the machines. + +By default, each instance has a rule which blocks all incoming Internet traffic and allows all outgoing traffic. To modify those settings, you can apply other security groups to it. + +Viewing the security groups[](#viewing-the-security-groups "Permalink to this headline") +----------------------------------------------------------------------------------------- + +To check your current security groups, please follow these steps: + +Log in to your CloudFerro Cloud account: . + +In the panel on the left choose **Network** and then **Security Groups**. + +You will see the list of your security groups there. The following groups should always be present: + +> * **default** which blocks all incoming traffic and allows all outgoing traffic. +> * **allow\_ping\_ssh\_rdp** which allows incoming ping, SSH (port 22) and RDP (port 3389) connections. This group is not attached to your VMs by default. + +![use-security-groups-1_creodias.png](../_images/use-security-groups-1_creodias.png) + +Creating a new security group[](#creating-a-new-security-group "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +In order to create a new security group, please follow these steps: + +Click the **Create Security Group** button. + +The following window should appear: + +![use-security-groups-2_creodias.png](../_images/use-security-groups-2_creodias.png) + +Give your security group a recognizable name in the **Name** text field. Optionally, you can also provide a description of it in the **Description** text field. + +Confirm your choices by clicking the **Create Security Group** button. + +You should now be taken to the screen which allows you to modify the security rules of that security group - in our case the group is called **my-group**: + +![use-security-groups-3_creodias.png](../_images/use-security-groups-3_creodias.png) + +Note + +If you want to access that screen later, you can click the **Manage Rules** button next to your security group in the **Security Groups** screen. + +By default, your new security group should contain two rules seen on the screenshot above - the first one allows all outgoing traffic on IPv4 and the second one allows all outgoing traffic on IPv6. + +Adding security rules to a security group[](#adding-security-rules-to-a-security-group "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------- + +In the **Manage Security Rules** screen that you entered in the previous step, click the **Add Rule** button. + +The following form will appear. In it you can define the security rule: + +![use-security-groups-4_creodias.png](../_images/use-security-groups-4_creodias.png) + +The drop-down list **Rule** allows you to choose the type of rule. These types, along with the available options for them, are explained below. Once you have finished, click **Add** to finish creating your rule. + +**Custom TCP Rule** + +This type of rule allows you to create a custom rule for the TCP protocol. This protocol is commonly used, amongst other things, for interacting with websites. + +You can optionally provide the description of that rule in the **Description** text field. + +The drop-down list **Direction** allows you to choose whether this rule should apply to incoming (**Ingress**) or outgoing (**Egress**) traffic. + +The drop-down list **Port** has the following options: + +> * If you choose **Port**, you will get the text field **Port** in which you can input one port for which this rule will apply. +> * If you choose **Port Range**, you will be able to enter the first port in range in the text field **From Port** and the last port in the text field **To Port**. +> * If you choose **All ports**, this rule will apply to all ports. + +The drop-down list **Remote** has the following options: + +> * If you choose **CIDR**, you will get the text field **CIDR** which allows you to input the IP address block for which this rule will apply using the CIDR notation, for example: **64.225.135.119/32**. This example means that only the **64.225.135.119** IP address is included in this rule. If this notation was as follows: **64.225.135.119/8**, then this rule would apply to all IP addresses that have the first digit **64**. +> * If you choose **Security Group**, you will get the drop-down list **Security Group** - the machines which are in that security group will be able to access your virtual machine. You will also get the drop-down list **Ether Type** from which you can choose IPv4 or IPv6. You should almost always use IPv4 for your network operations (apart from a few rare instances in which you know that IPv6 is needed). + +**Custom UDP Rule** + +This type of rule has the same options as **Custom TCP Rule**, but involves the UDP protocol. It is a protocol similar to TCP, but the main difference is that it does not provide session control. + +**Custom ICMP rule** + +This type of rule is used for ICMP. This protocol is used, among others, for **traceroute** and **ping**. It has the same options as the **Custom TCP Rule**, but instead of ports, it uses the ICMP types (which you should put in the **Type** text field) and ICMP codes (which should be put in the **Code** text field). + +**Other Protocol** + +This option is for protocols like for example SIP (protocol used for Internet telephony). + +**All ICMP**, **All TCP**, **All UDP** + +These options apply to all ports of ICMP, TCP and UPD, respectively. + +**Other options** + +The drop-down list **Rule** also contains templates for commonly used services like DNS (Domain Name Services), HTTP (Hypertext Transfer Protocol) or SMTP (Simple Mail Transfer Protocol). If you choose one of them, you only have to provide the information about the **Remote** - **CIDR** or **Security Group**. The explanation for those options is in the **Custom TCP Rule** section. + +Adding a Security Group to your VM[](#adding-a-security-group-to-your-vm "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +You can apply your security group to your VM either during or after creating it. + +### During its creation[](#during-its-creation "Permalink to this headline") + +During the process of creating your virtual machine you can add security groups to it. This happens during the **Security Groups** step: + +![use-security-groups-5_creodias.png](../_images/use-security-groups-5_creodias.png) + +You can add security groups to your VM by using the **↑** button an remove them using the **↓** button - the same as in the **Source** or **Network** steps. In this case, we have added the **my-group** group to the VM: + +![use-security-groups-6_creodias.png](../_images/use-security-groups-6_creodias.png) + +### After its creation[](#after-its-creation "Permalink to this headline") + +Go to **Compute** > **Instances**. Click the drop-down menu in the row containing information about the to which you wish to apply your rule (column **Actions**). Select **Edit Security Groups**. You should see the window similar to this: + +![use-security-groups-7_creodias.png](../_images/use-security-groups-7_creodias.png) + +In the left section you can see available security groups and in the right section you can see security groups already attached to your VM. To apply a security group to your VM, click the **+** button next to that group and to remove it, click the **-** button next to it. \ No newline at end of file diff --git a/docs/cloud/OpenStack-user-roles-on-CloudFerro-Cloud.html.md b/docs/cloud/OpenStack-user-roles-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..ebbf810 --- /dev/null +++ b/docs/cloud/OpenStack-user-roles-on-CloudFerro-Cloud.html.md @@ -0,0 +1,235 @@ +OpenStack User Roles on CloudFerro Cloud[](#openstack-user-roles-on-brand-name "Permalink to this headline") +============================================================================================================= + +A **user role** in OpenStack cloud is a set of permissions that govern how members of specific groups interact with system resources, their access scope, and capabilities. + +This guide simplifies OpenStack roles for casual users of CloudFerro Cloud VMs. It focuses on practical use cases and commonly required roles. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Frequently used user roles +> +> > * Common user roles +> > * Roles for Kubernetes users +> > * Roles for Load Balancer users +> +> * Examples of using user roles +> +> > * Using user roles while creating application credential in Horizon +> > * Using user roles while creating application credential via the CLI +> > * Using user roles while creating a new project +> > * Using member role only while creating a new user +> +> * Dictionary of other roles + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +**1. Account** + +You need a CloudFerro Cloud hosting account with Horizon access: . + +Also see: + +[What is an OpenStack project on CloudFerro Cloud](What-is-an-OpenStack-project-on-CloudFerro-Cloud.html) + +[What is an OpenStack domain on CloudFerro Cloud](What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html) + +[How to generate or use Application Credentials via CLI on CloudFerro Cloud](How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html) + +**2. Familiarity with OpenStack Commands** + +Ensure you know the following OpenStack commands: + +**openstack** +: The primary CLI for interacting with OpenStack services. + [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) + +**kubectl** +: CLI for Kubernetes clusters. Example article: + + [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](../kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +Frequently used user roles[](#frequently-used-user-roles "Permalink to this headline") +--------------------------------------------------------------------------------------- + +### Common user roles[](#common-user-roles "Permalink to this headline") + +**member** +: Grants standard access to project resources. + + Note + + Older OpenStack versions may use **\_member\_**. If both **member** and **\_member\_** exist, choose **member**. + + * Horizon: **Project** -> **Overview** + * CLI: **openstack server list**, **openstack project list** + +**observer** +: Read-only access for monitoring and auditing resources. Suitable for third-party tools like Prometheus or Grafana. + + * Horizon: **Project** -> **Overview** + * CLI: **openstack server show**, **openstack project show** + +**reader** +: Read-only access with slightly broader permissions than **observer**. Ideal for monitoring and analytics tools requiring detailed resource data. + + * Horizon: **Project** -> **Overview** + * CLI: **openstack server list**, **openstack project list** + +### Roles for Kubernetes users[](#roles-for-kubernetes-users "Permalink to this headline") + +**k8s\_admin** +: Administrative access to manage Kubernetes clusters and resources. + + * Horizon: **Kubernetes** -> **Clusters** + * CLI: **kubectl create deployment**, **kubectl get pods** + +**k8s\_developer** +: For developers deploying applications within Kubernetes. + + * Horizon: **Kubernetes** -> **Workloads** + * CLI: **kubectl create**, **kubectl apply** + +**k8s\_viewer** +: Read-only access to monitor Kubernetes resources. + + * Horizon: **Kubernetes** -> **Overview** + * CLI: **kubectl get pods**, **kubectl describe pod** + +### Roles for Load Balancer users[](#roles-for-load-balancer-users "Permalink to this headline") + +**load-balancer\_member** +: Grants access to deploy applications behind load balancers. + + * Horizon: **Network** -> **Load Balancers** + * CLI: **openstack loadbalancer member create**, **openstack loadbalancer member list** + +**load-balancer\_observer** +: Read-only access to monitor load balancer configurations. + + * Horizon: **Network** -> **Load Balancers** + * CLI: **openstack loadbalancer show**, **openstack loadbalancer stats show** + +How to View Roles in Horizon[](#how-to-view-roles-in-horizon "Permalink to this headline") +------------------------------------------------------------------------------------------- + +You can view roles in Horizon by navigating to **Identity** -> **Roles**. + +| | | +| --- | --- | +| ../_images/user-roles-list-2.png | ../_images/user-roles-list-1.png | + +Assigning multiple roles is best done during project creation rather than user creation. + +![openstack-user-roles-create-4.png](../_images/openstack-user-roles-create-4.png) + +Examples of using user roles[](#examples-of-using-user-roles "Permalink to this headline") +------------------------------------------------------------------------------------------- + +The following articles, as one of many steps, describe how to assign a role to the new project, credential, user or group. + +### Using user roles while creating application credential in Horizon[](#using-user-roles-while-creating-application-credential-in-horizon "Permalink to this headline") + +Normally, you access the cloud via user credentials, which may be one- or two-factor credentials. OpenStack provides a more direct procedure of gaining access to cloud with application credential and you can create a credential with several user roles. + +That S3 article selects user roles when creating an application credential, through Horizon: + +/s3/Create-S3-bucket-and-use-it-in-Sentinel-Hub-requests + +![user-roles-list-create-2.png](../_images/user-roles-list-create-2.png) + +### Using user roles while creating application credential via the CLI[](#using-user-roles-while-creating-application-credential-via-the-cli "Permalink to this headline") + +This is the main article about application credentials; it is mostly using CLI: + +[How to generate or use Application Credentials via CLI on CloudFerro Cloud](How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html) + +Here is how to specify user roles through CLI parameters: + +![user-roles-list-create-1.png](../_images/user-roles-list-create-1.png) + +### Using user roles while creating a new project[](#using-user-roles-while-creating-a-new-project "Permalink to this headline") + +In article [How to Create and Configure New Openstack Project Through Horizon on CloudFerro Cloud Cloud](../openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html) we use command **Project Members** to define which users to include into the project: + +![user-roles-list-create-4.png](../_images/user-roles-list-create-4.png) + +You would then continue by defining the roles for each user in the project: + +![user-roles-list-create-5.png](../_images/user-roles-list-create-5.png) +> See this Rancher article, [How to install Rancher RKE2 Kubernetes on CloudFerro Cloud](../kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html). Then, in Preparation step 1, a new project is created, with the following user roles: + +* **load-balancer\_member**, +* **member** and +* **creator**. + +![user-roles-list-create-6.png](../_images/user-roles-list-create-6.png) + +### Using member role only while creating a new user[](#using-member-role-only-while-creating-a-new-user "Permalink to this headline") + +In SLURM article, we first create a new OpenStack Keystone user, with the role of **member**. + +/cuttingedge/Sample-SLURM-Cluster-on-CloudFerro-Cloud-Cloud-with-ElastiCluster + +![user-roles-list-create-3.png](../_images/user-roles-list-create-3.png) + +That user can login to Horizon and use project resources together with other users which are defined in a similar way. + +Dictionary of other roles[](#dictionary-of-other-roles "Permalink to this headline") +------------------------------------------------------------------------------------- + +**admin** +: Grants unrestricted access to all resources and configurations in the system. Typically reserved for superusers or administrators. + +**project\_admin** +: Provides administrative privileges within a specific project, allowing users to manage resources, members, and settings at the project level. + +**network\_admin** +: Focused on managing networking resources, including creating networks, subnets, and routers, as well as assigning IPs. + +**storage\_admin** +: Offers full control over storage resources, such as creating, modifying, and deleting volumes and snapshots. + +**database\_admin** +: Designed for managing database resources, including provisioning, scaling, and backup configurations. + +**audit\_viewer** +: A read-only role dedicated to viewing logs, system events, and audit trails for compliance and monitoring purposes. + +**compute\_operator** +: Allows management of compute resources, such as starting, stopping, and resizing virtual machines, but without administrative privileges. + +**volume\_user** +: Enables users to attach and detach volumes to/from instances and perform basic volume management tasks. + +**image\_creator** +: Provides permissions to upload, manage, and delete virtual machine images in the image repository. + +**security\_group\_manager** +: Focused on managing security groups and rules, including creating and updating firewall configurations. + +**dns\_admin** +: Grants administrative privileges over DNS zones, records, and configurations. + +**keypair\_user** +: A role for managing SSH key pairs used for authenticating access to virtual machines. + +**heat\_stack\_owner** +: Enables users to create and manage orchestration stacks using Heat templates, including scaling and updating stacks. + +**backup\_admin** +: Offers full control over backup operations, such as scheduling backups, restoring data, and managing backup repositories. + +**report\_viewer** +: A read-only role that provides access to reports and analytics dashboards without the ability to modify data. + +**api\_user** +: Designed for programmatic access to the system via APIs, allowing automation and integration tasks. + +**support\_role** +: A limited-access role for customer support agents, enabling them to troubleshoot issues without full system access. + +**custom\_role (generic)** +: Represents a user-defined role tailored for specific permissions or organizational policies. Refer to system administrators for details on its scope. \ No newline at end of file diff --git a/docs/cloud/Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md b/docs/cloud/Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..943abe7 --- /dev/null +++ b/docs/cloud/Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,134 @@ +Resizing a virtual machine using OpenStack Horizon on CloudFerro Cloud[](#resizing-a-virtual-machine-using-openstack-horizon-on-brand-name "Permalink to this headline") +========================================================================================================================================================================= + +Introduction[](#introduction "Permalink to this headline") +----------------------------------------------------------- + +When creating a new virtual machine under OpenStack, one of the options you choose is the *flavor*. A flavor is a predefined combination of CPU, memory and disk size and there usually is a number of such flavors for you to choose from. + +After the instance is spawned, it is possible to change one flavor for another, and that process is called *resizing*. You might want to resize an already existing VM in order to: + +> * increase (or decrease) the number of CPUs used, +> * use more RAM to prevent crashes or enable swapping, +> * add larger storage to avoid running out of disk space, +> * seamlessly transition from testing to production environment, +> * change application workload byt scaling the VM up or down. + +In this article, we are going to resize VMs using commands in OpenStack Horizon. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **How to create a new VM** + +If you are a normal user of CloudFerro Cloud hosting, you will have all prerogatives needed to resize the VM. Make sure that the VM you are about to resize belongs to a project you have access to. Here are the basics of creating a Linux VM in Horizon: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html) + +No. 3 **Awareness of existing quotas and flavors limits** + +For general introduction to quotas and flavors, see [Dashboard Overview – Project Quotas And Flavors Limits on CloudFerro Cloud](Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html). + +Also: + +> * The VM you want to resize is in an active or shut down state. +> * A flavor with the desired resource configuration exists. +> * Adequate resources are available in your OpenStack environment to accommodate the resize. + +Creating a new VM[](#creating-a-new-vm "Permalink to this headline") +--------------------------------------------------------------------- + +To illustrate the commands in this article, let us create a new VM in order to start with a clean slate. (It goes without saying that you can practice with any of the already existing VMs in your account.) + +Use Prerequisite No. 2 to create a new VM and let it be called **Resizing**. Here is a typical list of flavors you might see: + +![resize-vm-horizon-1.png](../_images/resize-vm-horizon-1.png) + +For the sake of this article, let us choose a “middle” flavor – not too large and not to small to start with. Let it be **eo2a.large**. + +![resize-vm-horizon-2.png](../_images/resize-vm-horizon-2.png) + +Finish the process of creating a new VM and let it spawn: + +![resize-vm-horizon-3.png](../_images/resize-vm-horizon-3.png) + +Let us now resize the VM called **Resizing**. + +Steps to Resize the VM[](#steps-to-resize-the-vm "Permalink to this headline") +------------------------------------------------------------------------------- + +Locate the VM by using Horizon commands **Compute** -> **Instances**. + +Click the dropdown arrow next to the VM and select **Resize Instance**. + +![resize-vm-horizon-4.png](../_images/resize-vm-horizon-4.png) + +You get form **Resize Instance** on screen: + +![resize-vm-horizon-5.png](../_images/resize-vm-horizon-5.png) + +Assuming you wanted to scale up the VM, you could decide upon **eo2.xlarge**. Let us compare the two flavors: + +| Flavor | VCPUs | RAM | Total Disk | Root Disk | +| --- | --- | --- | --- | --- | +| eo2a.large | 2 | 7.45 GB | 32 GB | 32 GB | +| eo2.xlarge | 4 | 16 GB | 64 GB | 64 GB | + +So, select **eo2.xlarge** as the new flavor. This screen shows its parameters: + +![fwaas-openvpn-v2-34.png](../_images/fwaas-openvpn-v2-34.png) + +Advanced Options[](#advanced-options "Permalink to this headline") +------------------------------------------------------------------- + +**Advanced Options** tab contains two further options for resizing the instance. + +![resize-vm-horizon-10.png](../_images/resize-vm-horizon-10.png) + +Disk Partition +: Whether the entire disc is a single partition and automatically resizes. + Options are **Automatic** and **Manual** + +Server Group +: Here you select server group to which the instance can belong after resizing. Even if you never manually created a server group, they may be present as a consequence of creating Kubernete clusters, or using parameters for group affinity. + + The list can be quite long: + + ![resize-vm-horizon-11.png](../_images/resize-vm-horizon-11.png) + +Resize the VM[](#resize-the-vm "Permalink to this headline") +------------------------------------------------------------- + +Anyways, click on **Resize** to proceed with the resizing of the VM. + +![resize-vm-horizon-8.png](../_images/resize-vm-horizon-8.png) + +In **Status** column, there will be message **Confirm or Revert Resize/Migrate**. It means the system is waiting for you to decide what to do next. To confirm the resizing/migrating process, click on button **Confirm Resize/Migrate** in the **Actions** column. + +The resizing process will finish within a couple of seconds and the VM will be in **Status** Active. + +If you encounter issues, you can choose **Revert Resize** to return the VM to its previous state. This option is, however, only available before **Resize/Migration Confirmation**. + +Or, if the resizing is finished, you can again use option **Resize instance** and choose the flavor from which you started (**eo2a.large** in this case). This process of scaling down is much faster than the process of scaling up. + +Troubleshooting[](#troubleshooting "Permalink to this headline") +----------------------------------------------------------------- + +If any of the flavor parameters does not match up, the resizing will fail. + +You will then see balloon help in the right upper corner: + +![resize-vm-horizon-7.png](../_images/resize-vm-horizon-7.png) + +In this case, the sizes of the disk before and after the resizing do not match. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can also resize the virtual machine using only OpenStack CLI. More details here: [Resizing a virtual machine using OpenStack CLI on CloudFerro Cloud](../openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/cloud/Spot-instances-on-CloudFerro-Cloud.html.md b/docs/cloud/Spot-instances-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..ae6ba68 --- /dev/null +++ b/docs/cloud/Spot-instances-on-CloudFerro-Cloud.html.md @@ -0,0 +1,32 @@ +Spot instances on CloudFerro Cloud[](#spot-instances-on-brand-name "Permalink to this headline") +================================================================================================= + +Spot instance is resource similar to Amazon EC2 Spot Instances or Google Spot VMs. In short, user is provided with unused computational resources for a discounted price but those resources can be terminated on a short time notice whenever on-demand usage increases. The main use case are ephemeral workflows which can deal with being terminated unexpectedly and/or orchestration platforms which can deal with forced scaling down of available resources e.g. Kubernetes clusters. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to create spot instances +> * Additional configuration via tags +> * What is the expected behaviour + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: + +No. 2 **Available exclusively on WAW3-2 cloud** + +When using spot instances, be sure to work only on WAW3-2 cloud: + +![waw3-2-cloud-activated.png](../_images/waw3-2-cloud-activated.png) + +No. 3 **Using quotas and flavors** + +For quotas, see this article: [Dashboard Overview – Project Quotas And Flavors Limits on CloudFerro Cloud](Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html) + +No. 3 **OpenStack CLI client** + +If you want to interact with CloudFerro Cloud cloud using OpenStack CLI client, you need to have it installed. Check one of these articles: \ No newline at end of file diff --git a/docs/cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html.md b/docs/cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..a12d81b --- /dev/null +++ b/docs/cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html.md @@ -0,0 +1,77 @@ +Status Power State and dependencies in billing of instance VMs on CloudFerro Cloud[](#status-power-state-and-dependencies-in-billing-of-instance-vms-on-brand-name "Permalink to this headline") +================================================================================================================================================================================================= + +In OpenStack, instances have their own Status and Power State: + +> * **Status** informs about the present condition of the VM, while +> * **Power** states tell us only whether virtual machines are running or not. + +![statuspower.png](../_images/statuspower.png) + +There are six Power states, divided into two groups, depending on whether the VM is running or not. + +Power state while VM is running[](#power-state-while-vm-is-running "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +**NO STATE** +: VM is running, but encountered some fatal errors which require repeat launch of an instance. + +**RUNNING** +: VM is running properly. + +**PAUSED** +: VM is frozen and a memory dump is made. + +Power state while VM is turned off[](#power-state-while-vm-is-turned-off "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +**SHUT DOWN** +: VM is powered off properly. + +**CRASHED** +: VM is turned down due to fatal error. + +**SUSPENDED** +: VM is blocked by system (most likely because of negative credit on account). + +Status and its conditions[](#status-and-its-conditions "Permalink to this headline") +------------------------------------------------------------------------------------- + +Status may have one of the following conditions: + +**ERROR** +: Instance is not working due to problems in creation process. + + User is not charged. + +**ACTIVE** +: Instance is running with the specified image. + + User is charged for particular chosen flavor and storage. + +**PAUSED** +: Instance is paused with the specified image. + + User is charged for flavor and storage. + +**SUSPENDED** +: Instance is suspended with the specified image, with a valid memory snapshot. + + User is charged for flavor and storage. + +**SHUT OFF** +: Instance is powered down by the user and the image is on disk. + + User is charged for chosen flavor and storage. + +**SHELVED OFFLOADED** +: Instance is removed from the compute host and it can be reverted by “Unshelve instance” button. + + User is charged for storage. + +**RESIZED/MIGRATED** +: Instance is stopped on the source node but running on the destination node. Images exist at two locations. User confirmation is required. + + User is charged for the new flavor and storage. + +Please note that floating IP addresses are billed regardless of instance state. \ No newline at end of file diff --git a/docs/cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html.md b/docs/cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..d9803c4 --- /dev/null +++ b/docs/cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html.md @@ -0,0 +1,22 @@ +VM created with option Create New Volume No on CloudFerro Cloud[](#vm-created-with-option-create-new-volume-no-on-brand-name "Permalink to this headline") +=========================================================================================================================================================== + +During creation of a VM you can select a source. If you choose “Image”, you can then choose **Yes** or **No** for the option “**Create New Volume**”. + +![volno1.png](../_images/volno1.png) + +By default **No** is selected: + +![volno2.png](../_images/volno2.png) + +The new Virtual Machine will be created with the System Volume (Root Disk) size as defined in the flavor. + +![volno3.png](../_images/volno3.png) + +If you want to select a different size for the System Volume (Root Disk) please read article [VM created with option Create New Volume Yes on CloudFerro Cloud](VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html). + +![volno4.png](../_images/volno4.png) + +In contrast to a VM created when choosing **Yes**, when choosing **No** the system disk is “ephemeral” and will not be visible in the Volumes view. + +![volno5.png](../_images/volno5.png) \ No newline at end of file diff --git a/docs/cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html.md b/docs/cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..6aa8812 --- /dev/null +++ b/docs/cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html.md @@ -0,0 +1,72 @@ +VM created with option Create New Volume Yes on CloudFerro Cloud[](#vm-created-with-option-create-new-volume-yes-on-brand-name "Permalink to this headline") +============================================================================================================================================================= + +Note + +While creating a new Virtual Machine, you have to choose the source from which the VM will be built: + +![volyes1.png](../_images/volyes1.png) + +If you choose “Image”, you can choose the option “Create New Volume”: Yes or No. + +By default the option “No” is chosen. + +**Option: Create New Volume - Yes** + +This option allows you to choose the system volume different from that defined in the flavor: + +![volyes2.png](../_images/volyes2.png) + +Now you can choose the Volume Size. + +In the example below we will choose the volume 15 GB and apply it to the flavor eo1.xsmall. + +Default size of the system disk for flavor eo1.xsmall is 8 GB: + +![volyes3.png](../_images/volyes3.png) + +After choosing the other parameters (Details, Flavor, Networks, Security Group and Key Pair) you can launch the instance: + +![volyes4.png](../_images/volyes4.png) + +You can see the VM created: + +![volyes5.png](../_images/volyes5.png) + +If you go to Volumes -> Volumes pane you can see the system volume which the new VM is built on: + +![volyes6.png](../_images/volyes6.png) + +If you click on “Edit Volume” button, you will see that the volume is bootable: + +![volyes7.png](../_images/volyes7.png) + +If you previously have chosen “Delete Volume on Instance Delete”: No + +![volyes8.png](../_images/volyes8.png) + +and now you will delete the VM: + +![volyes9.png](../_images/volyes9.png) + +then the volume will remain (not attached to any instance): + +![volyes10.png](../_images/volyes10.png) + +You can now create a new VM from the volume choosing “Launch as Instance”: + +![volyes11.png](../_images/volyes11.png) + +![volyes12.png](../_images/volyes12.png) + +![volyes13.png](../_images/volyes13.png) + +you can choose different new flavor (eg. eo1.xmedium) than original (eo1.xsmall): + +![volyes14.png](../_images/volyes14.png) + +After choosing other parameters (Details, Networks, Security Group and Key Pair) you can launch the instance. + +![volyes15.png](../_images/volyes15.png) + +![volyes16.png](../_images/volyes16.png) \ No newline at end of file diff --git a/docs/cloud/What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html.md b/docs/cloud/What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html.md new file mode 100644 index 0000000..26df047 --- /dev/null +++ b/docs/cloud/What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html.md @@ -0,0 +1,24 @@ +What Image Formats are Available in OpenStack CloudFerro Cloud cloud[](#what-image-formats-are-available-in-openstack-brand-name-cloud "Permalink to this headline") +===================================================================================================================================================================== + +In CloudFerro Cloud OpenStack ten image format extensions are available: + +**QCOW2** - Formatted Virtual Machine Storage is a storage format for virtual machine disk images. QCOW stands for “QEMU copy on write”. It is used with the KVM hypervisor. The images are typically smaller than RAW images, so it is often faster to convert a raw image to qcow2 for uploading instead of uploading the raw file directly. Because raw images do not support snapshots, OpenStack Compute will automatically convert raw image files to qcow2 as needed. + +**RAW** - The RAW storage is the simplest one, and is natively supported by both KVM and Xen hypervisors. RAW image could be considered as the bit-equivalent of a block device file. It has a performance advantage over QCOW2 in that no formatting is applied to virtual machine disk images stored in the RAW format. No additional work from hosts is required in Virtual machine data operations on disk images stored in this format. + +**ISO** - The ISO format is a disk image formatted with the read-only ISO 9660 filesystem which is used for CDs and DVDs. While ISO is not frequently considered as a virtual machine image format, because of ISOs contain bootable filesystems with an installed operating system, it can be treated like other virtual machine image files. + +**VDI** - Virtual Disk Image format used by VirtualBox for image files. None of the OpenStack Compute hypervisors supports VDI directly, so it will be needed to convert these files to a different format to use them. + +**VHD** - Virtual Hard Disk format for images, widely used by Microsoft (e.g. Hyper-V, Microsoft Virtual PC). + +**VMDK** - Virtual Machine Disk format is used by VMware ESXi hypervisor for images. VMWare’s products use various versions and variations of VMDK disk images, so it’s important to understand where it can be used. + +**PLOOP** - A disk format supported and used by Virtuozzo to run OS Containers. + +**AKI/AMI/ARI** - was the initial image format supported by Amazon EC2. The image consists of three files: + +> * **AKI** - Amazon Kernel Image is a kernel file that the hypervisor will load initially to boot the image. For a Linux machine, this would be a vmlinuz file. +> * **AMI** - Amazon Machine Image is a virtual machine image in raw format, as described above. +> * **ARI** - Amazon Ramdisk Image is an optional ramdisk file mounted at boot time. For a Linux machine, this would be an initrd file. \ No newline at end of file diff --git a/docs/cloud/What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html.md b/docs/cloud/What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..112f985 --- /dev/null +++ b/docs/cloud/What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html.md @@ -0,0 +1,26 @@ +What is an OpenStack domain on CloudFerro Cloud[](#what-is-an-openstack-domain-on-brand-name "Permalink to this headline") +=========================================================================================================================== + +**Domain** + +Intention of providing a domain in cloud environment is to define boundaries for management. OpenStack domain is a type of a container for projects, users and groups. +One crucial benefit is separating overlapping resource names for different domains. +Furthermore, permissions in the project and domain are two not related things, hereby customization for administrator is made up much easier. + +Current domain name is **visible** beside the project that is currently selected in the Horizon panel. + +![cloud/domain_cloudferrocloud.png](_images/domain_cloudferrocloud.png) + +The name of the domain is grayed out, denoting that you can use only the domain that has been allocated to you by the system. + +You cannot create a new domain. + +**Service relation** + +CloudFerro Cloud account is linked to your main account in particular domain, hence it allows you to login to the OpenStack dashboard without any need to deliver keystone credentials. + +This type of facility is due to a proper implementation of KeyCloak and KeyStone relation. + +**Docs** + +Click here if you want to see official [OpenStack documentation for domains](https://docs.openstack.org/security-guide/identity/domains.html). \ No newline at end of file diff --git a/docs/cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html.md b/docs/cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..9832337 --- /dev/null +++ b/docs/cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html.md @@ -0,0 +1,23 @@ +What is an OpenStack project on CloudFerro Cloud[](#what-is-an-openstack-project-on-brand-name "Permalink to this headline") +============================================================================================================================= + +A **project** is a isolated group of zero or more users who share common access with specific privileges to the software instance in OpenStack. A project is created for each set of instances and networks that are configured as a discrete entity for the project. In Compute, a project owns virtual machines (in Compute) or containers (in Object Storage). + +You can imagine that the whole OpenStack cloud is a big cake of resources (vCPU, disks, instances, etc…) and projects are the pieces of this cake served to the customers. + +Current project name is **visible** in the Horizon panel. + +![project1.png](../_images/project1.png) + +Projects are created, managed, and edited at the OpenStack **Projects** screen. + +![project2.png](../_images/project2.png) + +Users can be associated with more than one project, but once signed, they can only see and access the resources available in that project. +Each project and user pairing can have a role associated with it. + +OpenStack users can create projects, and create new accounts using the OpenStack Dashboard. They can also associate other users with roles, projects, or both. + +To remove project its mandatory to manually remove all of its resources first. + +Users can create private networks for connectivity within projects [How to create a network with router in Horizon Dashboard on CloudFerro Cloud](../networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html). By default, they are fully isolated and are not shared with other projects. \ No newline at end of file diff --git a/docs/cloud/cloud.html.md b/docs/cloud/cloud.html.md new file mode 100644 index 0000000..14fc35b --- /dev/null +++ b/docs/cloud/cloud.html.md @@ -0,0 +1,2 @@ +CLOUD[](#cloud "Permalink to this headline") +============================================= \ No newline at end of file diff --git a/docs/datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html.md b/docs/datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b8833a4 --- /dev/null +++ b/docs/datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html.md @@ -0,0 +1,48 @@ +Bootable versus non-bootable volumes on CloudFerro Cloud[](#bootable-versus-non-bootable-volumes-on-brand-name "Permalink to this headline") +============================================================================================================================================= + +Each volume has an indicator called **bootable** which shows whether an operating system can be booted from it or not. That indicator can be set up manually at any time. If you set it up on a volume that does not contain a bootable operating system and later try to boot a VM from it, you will see an error as a response. + +In this article we will + +> * explain practical differences between **bootable** and **non-bootable** volumes and +> * provide procedures in Horizon and OpenStack CLI to check whether the volume **bootable** or not. + +Bootable vs. non-bootable volumes[](#bootable-vs-non-bootable-volumes "Permalink to this headline") +---------------------------------------------------------------------------------------------------- + +Bootable and non-bootable volumes share the following similarities: + +> * **Data storage**: both types can store data (regardless of being bootable or not) +> * **Persistance**: they can be retained even if an instance is removed +> * **Snapshots**: they allow you to create snapshots which represent state of a volume at a particular point in time. + +From a snapshot, you can spawn additional volumes so volumes act as a means of both conserving data and transferring of the data. + +Bootable volumes usually serve as a boot drive for a virtual machine while non-bootable volumes typically function as data storage only. Bootable volumes can also contain data but one part of capacity will be devoted to the operating system that they contain. + +On the other hand, non-bootable volumes can + +> * add more storage space to an instance (especially for applications which require lots of data) and +> * separate data from the operating system to make backups and data management easier. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Which volumes appear when creating a virtual machine using Horizon dashboard? +> * Attempting to create a virtual machine from non-bootable volume using OpenStack CLI +> * Checking whether a volume is bootable +> * Checking whether a volume snapshot was created from a bootable volume +> * Modifying bootable status of a volume +> * What happens if you launch a virtual machine from a volume which does not have a functional operating system? + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **OpenStack CLI client operational** + +We assume you are familiar with OpenStack CLI client. If not, here are some articles to get you started: \ No newline at end of file diff --git a/docs/datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html.md b/docs/datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..cd4ab03 --- /dev/null +++ b/docs/datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html.md @@ -0,0 +1,10 @@ +Ephemeral vs Persistent storage option Create New Volume on CloudFerro Cloud[](#ephemeral-vs-persistent-storage-option-create-new-volume-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================== + +Volumes created in the **Volumes > Volumes** section are *persistent* storage. They can be attached to a virtual machine and then reattached to a different one. They survive the removal of the virtual machine to which they are connected. You can also clone them, which is a simple way of creating a backup. However, if you copy them, you might also be interested in [Volume snapshot inheritance and its consequences on CloudFerro Cloud](Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html). + +If you follow the instructions in this article: [VM created with option Create New Volume Yes on CloudFerro Cloud](../cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html) and set **Delete Volume on Instance Delete** to **No**, the boot drive of such virtual machine will also be persistent storage. You can, for example, use this feature to perform various tests and experiments. + +If you do not need persistent storage, use *ephemeral* storage. It cannot be reattached to a different machine and will be removed if the machine is removed. See the article [VM created with option Create New Volume No on CloudFerro Cloud](../cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html) on how to create a virtual machine with this type of storage. + +You may find more information regarding this topic in [the official OpenStack documentation on design storage concepts](https://docs.openstack.org/arch-design/design-storage/design-storage-concepts.html). \ No newline at end of file diff --git a/docs/datavolume/How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html.md b/docs/datavolume/How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b5c57ea --- /dev/null +++ b/docs/datavolume/How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html.md @@ -0,0 +1,146 @@ +How To Attach Volume To Windows VM On CloudFerro Cloud[](#how-to-attach-volume-to-windows-vm-on-brand-name "Permalink to this headline") +========================================================================================================================================= + +In this tutorial, you will attach a volume to your Windows virtual machine. It increases the storage available for your files. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a new volume +> * Attaching the new volume to a VM +> * Preparing the volume to use with a VM + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Windows VM** + +You must operate a Microsoft Windows virtual machine running on CloudFerro Cloud cloud. You can access it using the webconsole ([How to access the VM from OpenStack console on CloudFerro Cloud](../cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html)) or through RDP. If you are using RDP, we strongly recommend using a bastion host for your security: [Connecting to a Windows VM via RDP through a Linux bastion host port forwarding on CloudFerro Cloud](../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html). + +Step 1: Create a New Volume[](#step-1-create-a-new-volume "Permalink to this headline") +---------------------------------------------------------------------------------------- + +Login to the Horizon panel available at . + +Go to the section **Volumes -> Volumes**: + +![create-volume-windows-01_creodias.png](../_images/create-volume-windows-01_creodias.png) + +Click **Create Volume**. + +The following window should appear: + +![create-volume-windows-02_creodias.png](../_images/create-volume-windows-02_creodias.png) + +In it provide the **Volume Name** of your choice. + +Choose the **Type** of your volume - SSD or HDD. + +Enter the size of your volume in gigabytes. + +When you’re done, click **Create Volume**. + +You should now see the volume you just created. In our case it is called **data**: + +![create-volume-windows-03_creodias.png](../_images/create-volume-windows-03_creodias.png) + +Step 2: Attach the Volume to VM[](#step-2-attach-the-volume-to-vm "Permalink to this headline") +------------------------------------------------------------------------------------------------ + +Now that you have created your volume, you can use it as storage for one of your VMs. To do that, attach the volume to a VM. + +Shut down your VM if it is running. + +In the **Actions** menu for that volume select the option **Manage Attachments**: + +![create-volume-windows-04_creodias.png](../_images/create-volume-windows-04_creodias.png) + +You should now see the following window: + +![create-volume-windows-05_creodias.png](../_images/create-volume-windows-05_creodias.png) + +Select the virtual machine to which the volume should be attached from the drop-down menu **Attach to Instance** and click **Attach Volume**. + +Your volume should now be attached to the virtual machine: + +![create-volume-windows-06_creodias.png](../_images/create-volume-windows-06_creodias.png) + +Step 3: Format the Drive[](#step-3-format-the-drive "Permalink to this headline") +---------------------------------------------------------------------------------- + +Start your VM and access it using RDP or the webconsole (see Prerequisite 2). Right-click the Start button and from the context menu select **Disk Management**. You should receive the following window: + +![create-volume-windows-07_creodias.png](../_images/create-volume-windows-07_creodias.png) + +In its lower section are the drives currently connected to your virtual machine: + +![create-volume-windows-08_creodias.png](../_images/create-volume-windows-08_creodias.png) + +In this case (on the screenshot above), there are two drives: + +> * the system drive with 32 GB space +> * the attached volume with 2 GB of unallocated space + +Right-click the section of the window in which the label **Not Initialized** exists: + +![create-volume-windows-09_creodias.png](../_images/create-volume-windows-09_creodias.png) + +From the context menu select **Initialize Disk**. You should receive the following window: + +![create-volume-windows-10_creodias.png](../_images/create-volume-windows-10_creodias.png) + +In this window you are asked which partition style do you want to use: MBR or GPT. If your volume has 2 TB or less space and you intend to use 4 primary partitions or less, you can use MBR, but if your requirements are higher, you should use GPT. + +Choose either of these options and click **OK**. + +Right-click the **Unallocated** space: + +![create-volume-windows-11_creodias.png](../_images/create-volume-windows-11_creodias.png) + +Choose **New Simple Volume**. + +You should receive the following window: + +![create-volume-windows-12_creodias.png](../_images/create-volume-windows-12_creodias.png) + +Click **Next >**. The following window should appear: + +![create-volume-windows-13_creodias.png](../_images/create-volume-windows-13_creodias.png) + +If you want your volume to have only one partition, leave the default value in the text field. Otherwise, enter the size of the first partition of your volume. + +You can choose to either assign a drive letter to your drive or mount it in an empty folder. + +* If you want to assign a drive letter to that volume, choose the **Assign the following drive letter:** radio button. From the drop-down menu to its right choose a letter to which you wish to attach your volume. Confirm your choice by clicking **OK**. +* If you want to mount the volume to an NTFS folder on your drive, choose **Mount in the following empty NTFS folder:**. Click **Browse…** and in the **Browse for Drive Path** window choose an empty folder in which you wish to mount it. Confirm your choice by clicking **OK**. + +The following window should now appear: + +![create-volume-windows-14_creodias.png](../_images/create-volume-windows-14_creodias.png) + +Here you can choose the formatting settings. Keep the radio button **Format this drive with the following settings:** selected. You can now enter the name which Windows will show for your new volume - it can be different then the one you typed in **Step 1**. Keep **Perform a quick format** checkbox selected. Click **Next >**. You should get the following window containing the summary of your chosen settings: + +![create-volume-windows-15_creodias.png](../_images/create-volume-windows-15_creodias.png) + +Click **Finish**. + +Once the formatting process is complete, you should see appropriate information about your volume in the **Disk Management** window: + +![create-volume-windows-16_creodias.png](../_images/create-volume-windows-16_creodias.png) + +Your volume should now be mounted. If you chose to assign a drive letter, it should be visible in the **This PC** window: + +![create-volume-windows-17_creodias.png](../_images/create-volume-windows-17_creodias.png) + +If you want to create more partitions, repeat right-clicking the **Unallocated** space and completing the wizard as previously explained. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Once you have gathered some data on your volume, you can create its backup, as explained in this article: + +[How to Create Backup of Your Volume From Windows Machine on CloudFerro Cloud](How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/datavolume/How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..3ef0516 --- /dev/null +++ b/docs/datavolume/How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html.md @@ -0,0 +1,156 @@ +How to Create Backup of Your Volume From Windows Machine on CloudFerro Cloud[](#how-to-create-backup-of-your-volume-from-windows-machine-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================== + +In this tutorial you will learn how create a backup of your volume on CloudFerro Cloud cloud. It allows you to save its state at a certain point in time and, for example, perform some experiments on it. You can then restore the volume to its previous state if you are unhappy with the results. + +Those backups are stored using object storage. Restoring a backup will delete all data added to a volume after backup was created. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Disconnecting the volume from a Windows virtual machine +> * Creating a backup of a volume +> * Restoring a backup of a volume +> * Reattaching a volume to your Windows virtual machine + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Windows VM** + +You must operate a Microsoft Windows virtual machine running on CloudFerro Cloud cloud. You can access it using the webconsole ([How to access the VM from OpenStack console on CloudFerro Cloud](../cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html)) or through RDP. If you are using RDP, we strongly recommend using a bastion host for your security: [Connecting to a Windows VM via RDP through a Linux bastion host port forwarding on CloudFerro Cloud](../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html). + +No. 3 **Volume** + +A volume must be connected to your Windows virtual machine. + +Disconnecting the volume from a virtual machine[](#disconnecting-the-volume-from-a-virtual-machine "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +Before creating a backup of your volume, disconnect it. + +On your virtual machine, right-click the Start menu and select **Disk Management**. + +![volume-backup-01_creodias.png](../_images/volume-backup-01_creodias.png) + +A window similar to this should appear: + +![volume-backup-02_creodias.png](../_images/volume-backup-02_creodias.png) + +Right-click your attached volume and select **Change Drive Letter and Paths…**. The following window should appear: + +![volume-backup-03_creodias.png](../_images/volume-backup-03_creodias.png) + +Select the drive letter or mount point of your drive and click **Remove**. + +Note + +If you receive the following warning: + +![volume-backup-04_creodias.png](../_images/volume-backup-04_creodias.png) + +make sure that the removal does not break your workflow and click **Yes**. + +Shut down the virtual machine and return to the Horizon dashboard: + +Go to **Volumes** > **Volumes**. You should see your volume there: + +![volume-backup-05_creodias.png](../_images/volume-backup-05_creodias.png) + +Select **Manage Attachments** from the drop-down menu in the **Actions** column for your volume: + +![volume-backup-06_creodias.png](../_images/volume-backup-06_creodias.png) + +The following window should appear: + +![volume-backup-07_creodias.png](../_images/volume-backup-07_creodias.png) + +Click **Detach Volume** and confirm your choice. + +Creating a Backup of Your Volume[](#creating-a-backup-of-your-volume "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Now that you have detached the volume from your virtual machine, you can make its backup by following these steps: + +> * Go to **Volumes** > **Volumes**. +> * Choose **Create Backup** from the drop-down menu in the **Actions** column for your volume. You should get the following window: + +![volume-backup-08_creodias.png](../_images/volume-backup-08_creodias.png) + +* Enter the chosen name for your backup in the **Backup Name** text field. Optionally, you can provide its description in the **Description** text field. Once you’re ready, click **Create Volume Backup**. + +Clicking **Create Volume Backup** initializes the process of backup creation and moves you to the **Volumes** > **Backups** section of the Horizon dashboard. There you should see that your backup is being created. + +The time it takes to create the backup will vary. + +Once the process is over, you should see the status **Available** next to your backup: + +![volume-backup-09_creodias.png](../_images/volume-backup-09_creodias.png) + +Restoring the backup[](#restoring-the-backup "Permalink to this headline") +--------------------------------------------------------------------------- + +There are two ways of restoring a backup: + +> * You can overwrite an existing volume with the content of the backup. This will delete all data that currently resides on that volume. +> * You can create a new volume based on the content of the backup. + +Go to **Volumes** > **Backups** section of the Horizon dashboard. In the **Actions** column of the appropriate backup, choose **Restore Backup**. The following window should appear: + +![volume-backup-10_creodias.png](../_images/volume-backup-10_creodias.png) + +Use **Select Volume** drop-down list to select the volume which your backup will replace. You can also create a new volume from that backup by choosing **Create a New Volume**. + +In either case, click **Restore Backup to Volume**. This will initialize the process of restoring backup and move you to the **Volumes** > **Volumes** section of the Horizon dashboard. + +Once this operation is completed, you should see the status **Available** next to your volume: + +![volume-backup-11_creodias.png](../_images/volume-backup-11_creodias.png) + +You can now reattach the volume to your virtual machine. + +Reattaching the volume to your virtual machine[](#reattaching-the-volume-to-your-virtual-machine "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +In the **Volumes** > **Volumes** section of the Horizon dashboard, find the row containing your volume. Choose **Manage Attachments** from the drop-down menu in the **Actions** column for it. You should get the following window: + +![volume-backup-12_creodias.png](../_images/volume-backup-12_creodias.png) + +From the drop-down menu **Attach To Instance** choose the name of the virtual machine to which the volume was previously attached. Click **Attach Volume**. + +Attaching should take up to a few seconds. Once it is completed, you should see appropriate information in the **Attached To** column for your volume: + +![volume-backup-13_creodias.png](../_images/volume-backup-13_creodias.png) + +Go to **Compute** > **Instances**. Choose **Start Instance** in the row with the virtual machine to which the volume has just been attached. Login to your Windows VM using RDP or the webconsole (see Prerequisite No. 2). + +On your virtual machine, right-click the Start menu and select **Disk Management**. You should receive the following window: + +![volume-backup-14_creodias.png](../_images/volume-backup-14_creodias.png) + +Note + +If at the bottom of the screen you see status **Offline** next to your attached volume, right-click it and choose **Online** from the context menu. + +![volume-backup-15_creodias.png](../_images/volume-backup-15_creodias.png) + +Right-click your attached volume and select **Change Drive Letter and Paths…**. The window titled **Change Drive Letter and Paths for New Volume** should appear: + +![volume-backup-16_creodias.png](../_images/volume-backup-16_creodias.png) + +Click **Add…**. The following window should appear: + +![volume-backup-17_creodias.png](../_images/volume-backup-17_creodias.png) + +You can choose to either assign a drive letter to your drive or mount it in an empty folder. + +* If you want to assign a drive letter to that volume, choose the **Assign the following drive letter:** radio button. From the drop-down menu to its right choose a letter to which you wish to attach your volume. Confirm your choice by clicking **OK**. +* If you want to mount the volume to an NTFS folder on your drive, choose **Mount in the following empty NTFS folder:**. Click **Browse…** and in the **Browse for Drive Path** window choose an empty folder in which you wish to mount it. Confirm your choice by clicking **OK**. + +Your volume should now be mounted. If you chose to assign a drive letter, it should be visible in the **This PC** window: + +![volume-backup-18_creodias.png](../_images/volume-backup-18_creodias.png) \ No newline at end of file diff --git a/docs/datavolume/How-many-objects-can-I-put-into-Object-Storage-container-bucket-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-many-objects-can-I-put-into-Object-Storage-container-bucket-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..6b6dd9b --- /dev/null +++ b/docs/datavolume/How-many-objects-can-I-put-into-Object-Storage-container-bucket-on-CloudFerro-Cloud.html.md @@ -0,0 +1,4 @@ +How many objects can I put into Object Storage container bucket on CloudFerro Cloud[](#how-many-objects-can-i-put-into-object-storage-container-bucket-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================== + +It is highly advisable to put no more than 1 million (1 000 000) objects into one bucket (container). Having more objects makes listing of them very inefficient. We suggest to create many buckets with a small amount of objects instead of a small amount of buckets with many objects. \ No newline at end of file diff --git a/docs/datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..a6972ce --- /dev/null +++ b/docs/datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,277 @@ +How to attach a volume to VM less than 2TB on Linux on CloudFerro Cloud[](#how-to-attach-a-volume-to-vm-less-than-2tb-on-linux-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================== + +In this tutorial, you will create a volume which is smaller than 2 TB. Then, you will attach it to a VM and format it in the appropriate way. + +Note + +If you want to create and attach a volume that has more than 2 TB of storage, you will need to use different software for its formatting. If this is the case, please visit the following article instead: [How to attach a volume to VM more than 2TB on Linux on CloudFerro Cloud](How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html). + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a new volume +> * Attaching the new volume to a VM +> * Formatting and mounting of the new volume + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 Linux VM running on the CloudFerro Cloud cloud + +Instructions for creating and accessing a Linux VM using default images can be found here: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +or here: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html). + +The instructions included in this article are designed for Ubuntu 22.04 LTS. + +No. 3 **Basic knowledge of the Linux terminal** + +You will need basic knowledge of the Linux command line. + +No. 4 **SSH access to the VM** + +[How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud](../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html). + +Step 1: Create a Volume[](#step-1-create-a-volume "Permalink to this headline") +-------------------------------------------------------------------------------- + +Login to the Horizon panel available at . + +Go to the section **Volumes -> Volumes**: + +![volume-less-01_creodias.png](../_images/volume-less-01_creodias.png) + +Click **Create Volume**. + +The following window should appear: + +![volume-less-02_creodias.png](../_images/volume-less-02_creodias.png) + +In it provide the **Volume Name** of your choice. + +Choose the **Type** of your volume - SSD or HDD. + +Enter the size of your volume in gigabytes. + +When you’re done, click **Create Volume**. + +You should now see the volume you just created. In our case it is called **volume-small**: + +![volume-less-03_creodias.png](../_images/volume-less-03_creodias.png) + +Step 2: Attach the Volume to VM[](#step-2-attach-the-volume-to-vm "Permalink to this headline") +------------------------------------------------------------------------------------------------ + +Now that you have created your volume, you can use it as storage for one of your VMs. To do that, attach the volume to a VM. + +In the **Actions** menu for that volume select the option **Manage Attachments**: + +![volume-less-04_creodias.png](../_images/volume-less-04_creodias.png) + +You should now see the following window: + +![volume-less-05_creodias.png](../_images/volume-less-05_creodias.png) + +Select the virtual machine to which the volume should be attached: + +![volume-less-06_creodias.png](../_images/volume-less-06_creodias.png) + +Click **Attach Volume**. + +Your volume should now be attached to the VM: + +![volume-less-07_creodias.png](../_images/volume-less-07_creodias.png) + +Step 3: Partition the Volume[](#step-3-partition-the-volume "Permalink to this headline") +------------------------------------------------------------------------------------------ + +It is time to access your virtual machine to prepare the volume for data storage. + +Connect to your virtual machine using SSH or the web console. + +Execute the following command to make sure that the volume has been attached: + +``` +lsblk + +``` + +You should see the output similar to this: + +![volume-less-08_creodias.png](../_images/volume-less-08_creodias.png) + +In this example, the attached volume that was previously called **volume-small** is represented by the device file **sdb**. Its size is 100 GB. Memorize the name of the *device file* representing the drive you attached or write it somewhere down - it will be needed later during starting **fdisk**. + +In order to be able to use the volume as storage, you will need to use **fdisk** to create a partition table. + +Start **fdisk** (replace **sdb** with the name of the device file provided to you previously by the **lsblk** command): + +``` +sudo fdisk /dev/sdb + +``` + +You should now see the following prompt: + +``` +Command (m for help): + +``` + +Answer with **n** and press Enter. A series of prompts similar to the ones below will appear on screen - keep pressing Enter on your keyboard to accept the default values. + +``` +Partition type +p primary (0 primary, 0 extended, 4 free) +e extended (container for logical partitions) +Select (default p): + +Using default response p. +Partition number (1-4, default 1): +First sector (2048-209715199, default 2048): +Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715199, default 209715199): + +``` + +You should now see the confirmation similar to this: + +``` +Created a new partition 1 of type 'Linux' and of size 100 GiB. + +``` + +After it you will see the following prompt again: + +``` +Command (m for help): + +``` + +This time, answer with **w**. You will see the following message: + +``` +The partition table has been altered. +Calling ioctl() to re-read partition table. +Syncing disks. + +``` + +Execute the following command again to confirm that the partition was created successfully: + +``` +lsblk + +``` + +The device file of the new partition should have the same name as the device file of the drive followed by the **1** digit. In this case, it will be **sdb1**. Memorize or write it somewhere down - it will be needed later during creation of the file system. + +![volume-less-09_creodias.png](../_images/volume-less-09_creodias.png) + +Step 5: Create the File System[](#step-5-create-the-file-system "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +In order to save data on this volume, create **ext4** filesystem on it. **ext4** is arguably the most popular filesystem on Linux distributions. + +It can be created by executing the following command: + +``` +sudo mkfs.ext4 /dev/sdb1 + +``` + +Replace **sdb1** with the name of the device file of the partition provided to you previously by the **lsblk** command. + +This process should take less than a minute. + +Step 6: Create the mount point[](#step-6-create-the-mount-point "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +You need to specify the location in the directory structure from which you will access the data stored on that volume. In Linux it is typically done in the **/etc/fstab** config file. + +Below are the instructions for the **nano** text editor. If you prefer to use different software, please modify them accordingly. + +Install **nano** if you haven’t already: + +``` +sudo apt install nano + +``` + +Open the **/etc/fstab** file using **nano**: + +``` +sudo nano /etc/fstab + +``` + +Add the below line to the end of that file. Remember to replace **sdb1** with the name of the device file of your partition (it was provided to you previously be the **lsblk** command) and **/my\_volume** with the directory in which you want to mount it - the mounting point. + +``` +/dev/sdb1 /my_volume ext4 defaults 0 1 + +``` + +![volume-less-10_creodias.png](../_images/volume-less-10_creodias.png) + +To save that file in **nano**, use the following combination of keys: CTRL+X, Y, Enter. + +Warning + +Unless you know what you’re doing, you should not modify the lines which you already found in the **/etc/fstab** file. This file contains important information. Some or all of it might be required for the startup of the operating system. + +Next, create a new or use an existing directory to use as your mounting point. If you need to create it anew, the command would be: + +``` +sudo mkdir /my_volume + +``` + +Mount the volume to your system (replace **/my\_volume** with your mount point): + +``` +sudo mount /my_volume + +``` + +To check whether it was successfully mounted, execute: + +``` +df -h + +``` + +The output should look like this: + +![volume-less-11_creodias.png](../_images/volume-less-11_creodias.png) + +The volume is owned by **root**, so **eouser** does not have access without **sudo**. To make it accessible to **eouser**, execute this command: + +``` +sudo chown eouser:eouser /my_volume + +``` + +If you want everybody to have access to that directory (and you don’t care about security at all), use the following command: + +``` +sudo chmod 777 /my_volume + +``` + +During the next boot of your virtual machine, the volume should be mounted automatically. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You have successfully created a volume and prepared it for use on a Linux virtual machine. + +You can now copy files to your new volume. If you want to move the data, attach the volume to a different machine. \ No newline at end of file diff --git a/docs/datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..01d45cf --- /dev/null +++ b/docs/datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,289 @@ +How to attach a volume to VM more than 2TB on Linux on CloudFerro Cloud[](#how-to-attach-a-volume-to-vm-more-than-2tb-on-linux-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================== + +In this tutorial, you will create a volume which is larger than 2 TB. Then, you will attach it to a VM and format it in the appropriate way. + +Note + +If you want to create and attach a volume that has less than 2 TB of storage, you will need to use different software for its formatting. If this is the case, please visit the following article instead: [How to attach a volume to VM less than 2TB on Linux on CloudFerro Cloud](How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html). + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a new volume +> * Attaching the new volume to a VM +> * Formatting and mounting of the new volume + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 Linux VM running on CloudFerro Cloud cloud + +Instructions for creating and accessing a Linux VM using default images can be found here: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) or here: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html). + +The instructions included in this article are designed for Ubuntu 20.04 LTS. + +No. 3 **Basic knowledge of the Linux terminal** + +You will need basic knowledge of the Linux command line. + +No. 4 **SSH access to the VM** + +[How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud](../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html). + +Step 1: Create a Volume[](#step-1-create-a-volume "Permalink to this headline") +-------------------------------------------------------------------------------- + +Login to the Horizon panel available at . + +Go to the section **Volumes -> Volumes**: + +![volume-more-01_creodias.png](../_images/volume-more-01_creodias.png) + +Click **Create Volume**. + +The following window should appear: + +![volume-more-02_creodias.png](../_images/volume-more-02_creodias.png) + +In it provide the **Volume Name** of your choice. + +Choose the **Type** of your volume - SSD or HDD. + +Enter the size of your volume in gigabytes. + +When you’re done, click **Create Volume**. + +You should now see the volume you just created. In our case it is called **my-files**: + +![volume-more-03_creodias.png](../_images/volume-more-03_creodias.png) + +Step 2: Attach the Volume to VM[](#step-2-attach-the-volume-to-vm "Permalink to this headline") +------------------------------------------------------------------------------------------------ + +Now that you have created your volume, you can use it as storage for one of your VMs. To do that, attach the volume to a VM. + +In the **Actions** menu for that volume select the option **Manage Attachments**: + +![volume-more-04_creodias.png](../_images/volume-more-04_creodias.png) + +You should now see the following window: + +![volume-more-05_creodias.png](../_images/volume-more-05_creodias.png) + +Select the virtual machine to which the volume should be attached: + +![volume-more-06_creodias.png](../_images/volume-more-06_creodias.png) + +Click **Attach Volume**. + +Your volume should now be attached to the VM: + +![volume-more-07_creodias.png](../_images/volume-more-07_creodias.png) + +Step 3: Create the Partition Table[](#step-3-create-the-partition-table "Permalink to this headline") +------------------------------------------------------------------------------------------------------ + +It is time to access your virtual machine to prepare the volume for data storage. + +Connect to your virtual machine using SSH or the web console. + +Execute the following command to make sure that the volume has been attached: + +``` +lsblk + +``` + +You should see the output similar to this: + +![volume-more-08_creodias.png](../_images/volume-more-08_creodias.png) + +In this example, the attached volume that was previously called **my-files** is represented by the device file **sdb**. Its size is 2.4 TB. Memorize the name of the *device file* or write it somewhere down; it will be needed in the next step, which involves starting **gdisk**. + +In order to be able to use the volume as storage, you will need to use **gdisk** to create a partition table. If you do not have this program, you can install it using the following command: + +``` +sudo apt update && sudo apt upgrade && sudo apt install gdisk + +``` + +Start **gdisk** (replace **sdb** with the name of the device file provided to you previously by the **lsblk** command): + +``` +sudo gdisk /dev/sdb + +``` + +You should see the output similar to this: + +``` +GPT fdisk (gdisk) version 1.0.8 + +Partition table scan: + MBR: not present + BSD: not present + APM: not present + GPT: not present + +Creating new GPT entries in memory. + +Command (? for help): + +``` + +Answer with **n** and press Enter. A series of prompts similar to the ones below will appear on screen - keep pressing Enter on your keyboard to accept the default values. + +``` +Command (? for help): n +Partition number (1-128, default 1): +First sector (34-5033164766, default = 2048) or {+-}size{KMGTP}: +Last sector (2048-5033164766, default = 5033164766) or {+-}size{KMGTP}: +Current type is 8300 (Linux filesystem) +Hex code or GUID (L to show codes, Enter = 8300): +Changed type of partition to 'Linux filesystem' + +``` + +You will see the prompt **Command (? for help):** again. Answer it with **w**. You will now see the following question: + +``` +Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING +PARTITIONS!! + +Do you want to proceed? (Y/N): + +``` + +Answer with **Y** to confirm. You should get the following confirmation: + +``` +OK; writing new GUID partition table (GPT) to /dev/sdb. + +``` + +In the end, you should receive this message: + +``` +The operation has completed successfully. + +``` + +Execute the following command again to confirm that the partition was created successfully: + +``` +lsblk + +``` + +The device file of the new partition should have the same name as the device file of the drive followed by the **1** digit. In this case, it will be **sdb1**. Memorize or write it somewhere down - it will be needed later during creation of the file system. + +![volume-more-09_creodias.png](../_images/volume-more-09_creodias.png) + +Step 5: Create the File System[](#step-5-create-the-file-system "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +In order to save data on this volume, create **ext4** filesystem on it. **ext4** is arguably the most popular filesystem on Linux distributions. + +It can be created by executing the following command: + +``` +sudo mkfs.ext4 /dev/sdb1 + +``` + +Replace **sdb1** with the name of the device file of the partition provided to you previously by the **lsblk** command. + +This process took less than a minute for a 2,4 terabyte volume. + +Step 6: Create the mount point[](#step-6-create-the-mount-point "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +You need to specify the location in the directory structure from which you will access the data stored on that volume. In Linux it is typically done in the **/etc/fstab** config file. + +Below are the instructions for the **nano** text editor. If you prefer to use different software, please modify them accordingly. + +Before using **nano**, create the directory in which you wish to mount your volume - your mount point - (if it doesn’t exist yet). In this example, we will use the **/my\_volume** directory which can be created using the following command: + +``` +sudo mkdir /my_volume + +``` + +Install **nano** if you haven’t already: + +``` +sudo apt install nano + +``` + +Open the **/etc/fstab** file using **nano**: + +``` +sudo nano /etc/fstab + +``` + +Add the below line to the end of that file. Remember to replace **sdb1** with the name of the device file of your partition (it was provided to you previously be the **lsblk** command) and **/my\_volume** with the directory in which you want to mount it - the mounting point. + +``` +/dev/sdb1 /my_volume ext4 defaults 0 1 + +``` + +![volume-more-10_creodias.png](../_images/volume-more-10_creodias.png) + +To save that file in **nano**, use the following combination of keys: CTRL+X, Y, Enter. + +Warning + +Unless you know what you’re doing, you should not modify the lines which you already found in the **/etc/fstab** file. This file contains important information. Some or all of it might be required for the startup of the operating system. + +Mount the volume to your system (replace **/my\_volume** with the mount point you previously created): + +``` +sudo mount /my_volume + +``` + +To check whether it was successfully mounted, execute: + +``` +df -h + +``` + +The output should contain the line with the device file representing your volume and its mount point. It can look like this: + +![volume-more-11_creodias.png](../_images/volume-more-11_creodias.png) + +The volume is owned by **root**, so **eouser** does not have access without **sudo**. To make it accessible to **eouser**, execute this command: + +``` +sudo chown eouser:eouser /my_volume + +``` + +If you want everybody to have access to that directory (and you don’t care about security at all), use the following command: + +``` +sudo chmod 777 /my_volume + +``` + +During the next boot of your virtual machine, the volume should be mounted automatically. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You have successfully created a volume larger than 2 TB and prepared it for use on a Linux virtual machine. + +You can now copy files to your new volume. If you want to move the data, attach the volume to a different machine. \ No newline at end of file diff --git a/docs/datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..5ff01e3 --- /dev/null +++ b/docs/datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html.md @@ -0,0 +1,17 @@ +How to create or delete volume snapshot on CloudFerro Cloud[](#how-to-create-or-delete-volume-snapshot-on-brand-name "Permalink to this headline") +=================================================================================================================================================== + +Volume snapshot allows you to save the state of volume at a specific point in time. Here is how to create or delete volume snapshot using Horizon dashboard or OpenStack CLI client. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with access to Horizon interface: + +No. 2 **A volume** + +You need to have the volume which will serve as a source of your volume snapshot. + +To prevent data corruption while creating a snapshot, the volume should not be connected to a virtual machine. If it is, disconnect it from the volume using one of these articles: \ No newline at end of file diff --git a/docs/datavolume/How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..f42b965 --- /dev/null +++ b/docs/datavolume/How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html.md @@ -0,0 +1,21 @@ +How to create volume Snapshot and attach as Volume on Linux or Windows on CloudFerro Cloud[](#how-to-create-volume-snapshot-and-attach-as-volume-on-linux-or-windows-on-brand-name "Permalink to this headline") +================================================================================================================================================================================================================= + +To create a snapshot of a Volume: + +* Click Volumes tab in Horizon and choose “Create Snapshot” from dropdown menu. +* Unmap disk in Windows VM, then in Horizon click on option “Manage Attachments” -> “Detach Volume” + +It is possible to create snapshot of attached volume but if any data are writen on it while creating snapshot, it might result in corrupted volume. + +* Convert snapshot into Volume - “Volume Snapshots” -> “Create Volume”. +* Map new Volume in your Windows VM. + +For Linux systems you may mount that newly created Volume and access the data, the filesystem is the same as on the original Volume. + +For example, if the Volume has one partition and is attached as **/dev/vdc**, do + +``` +sudo mkdir /my_snapshot1 && sudo mount /dev/vdc1 /my_snapshot1 + +``` \ No newline at end of file diff --git a/docs/datavolume/How-to-export-a-volume-over-NFS-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-export-a-volume-over-NFS-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..4c1b372 --- /dev/null +++ b/docs/datavolume/How-to-export-a-volume-over-NFS-on-CloudFerro-Cloud.html.md @@ -0,0 +1,123 @@ +How to export a volume over NFS on CloudFerro Cloud[](#how-to-export-a-volume-over-nfs-on-brand-name "Permalink to this headline") +=================================================================================================================================== + +**Server configuration** + +Update your system: + +``` +sudo apt update && apt upgrade + +``` + +Install necessary packages: + +``` +sudo apt install nfs-kernel-server + +``` + +Create a new folder, which will be exported by NFS, e.g.: + +``` +sudo mkdir -p /mnt/ + +``` + +Delete all access restrictions in the folder: + +``` +sudo chown -R nobody:nogroup /mnt// + +``` + +You can also replace permisssions of files in the folder with your own preferences. + +e.g. + +``` +sudo chmod 777 /mnt// + +``` + +**Defining access permisions to NFS Server.** + +In the file /etc/exports add the following line: + +``` +/mnt/ (rw,sync,no_subtree_check) + +``` + +where is the address of the server allowed to access the folder /mnt/ + +e.g. + +``` +# /etc/exports: the access control list for filesystems which may be exported + +# to NFS clients. See exports(5). + +# + +# Example for NFSv2 and NFSv3: + +# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) + +# + +# Example for NFSv4: + +# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) + +# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) + +# + +/mnt/ (rw,sync,no_subtree_check) + +``` + +You can also share your folder to more IP addresses: + +``` +/mnt/ (rw,sync,no_subtree_check) +/mnt/ (rw,sync,no_subtree_check) +/mnt/ (rw,sync,no_subtree_check) + +``` + +You can also share the folder to all servers in a Subnet (instead of adding every IP address separately) by adding following line to /etc/exports (e.g. servers in 192.168.0.0/24): + +``` +/mnt/ 192.168.0.0/24(rw,sync,no_subtree_check) + +``` + +When the configuration file /etc/exports is saved, invoke the following commands: + +``` +sudo exportfs -a +sudo systemctl restart nfs-kernel-server + +``` + +**IT IS NECESSARY TO OPEN THE PORT 2049 IN A SECURITY GROUP!** + +(The FAQ about opening ports in a security group is available at [How can I open new ports for http for my service or instance on CloudFerro Cloud](../networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html)) + +**Client Configuration** + +Install required packages: + +``` +sudo apt install nfs-common + +``` + +Mount the NFS folder: + +``` +sudo mount :/mnt/ / + +``` \ No newline at end of file diff --git a/docs/datavolume/How-to-export-a-volume-over-NFS-outside-of-a-project-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-export-a-volume-over-NFS-outside-of-a-project-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b8cdbed --- /dev/null +++ b/docs/datavolume/How-to-export-a-volume-over-NFS-outside-of-a-project-on-CloudFerro-Cloud.html.md @@ -0,0 +1,101 @@ +How to export a volume over NFS outside of a project on CloudFerro Cloud[](#how-to-export-a-volume-over-nfs-outside-of-a-project-on-brand-name "Permalink to this headline") +============================================================================================================================================================================= + +**Prerequisites** + +Two Ubuntu servers in various projects (not in a private network) which all have a floating IP assigned. + +``` +Host: 64.225.128.1 +Client: 64.225.128.2 + +``` + +On both servers we will create a directory /xdata, which will be shared. + +**On the host** + +``` +eouser@host:~$ sudo apt-get update +eouser@host:~$ sudo apt-get install nfs-kernel-server +eouser@host:~$ sudo mkdir /xdata +eouser@host:~$ sudo chown nobody:nogroup /xdata +eouser@host:~$ sudo nano /etc/exports + +``` + +Add the line: + +``` +/xdata 64.225.128.2(rw,sync,no_subtree_check) + +``` + +Save the file. + +Start the server: + +``` +eouser@host:~$ sudo systemctl restart nfs-kernel-server + +``` + +For Ubuntu, start the server with this command: + +``` +eouser@host:~$ sudo service nfs-kernel-server start + +``` + +Now go to + +Create new security group. + +Give it a name (eg. allow\_nfs) and save by clicking “Create security group” button. + +Click “manage rules”. + +Click “add rule” + +Choose: + +Rule: Custom TCP Rule + +Direction: Ingress + +Openport: Port + +Port: 2049 + +Remote: CIDR + +CIDR: 64.225.128.2 + +Click “Add” + +Go to + +From the drop-down menu on the right of the “Host” instance, choose “Edit Security Groups”. + +Click on the “plus” sign on the “allow\_nfs” group. + +This will move the group from “All Security Groups” to “Instance Security Groups”. + +Click “Save”. + +**On the Client** + +``` +eouser@client:~$ sudo apt-get update +eouser@client:~$ sudo apt-get install nfs-common +eouser@client:~$ sudo mkdir /xdata +eouser@client:~$ sudo mount 64.225.128.1:/xdata /xdata + +``` + +You can check if the directory is mounted: + +``` +eouser@client:~$ df -h + +``` \ No newline at end of file diff --git a/docs/datavolume/How-to-extend-the-volume-in-Linux-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-extend-the-volume-in-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..db5f8db --- /dev/null +++ b/docs/datavolume/How-to-extend-the-volume-in-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,137 @@ +How to extend the volume in Linux on CloudFerro Cloud[](#how-to-extend-the-volume-in-linux-on-brand-name "Permalink to this headline") +======================================================================================================================================= + +It is possible to extend a Volume from the Horizon dashboard. + +Another method is to create a new volume, attach it to a VM, copy all the data from the old volume to the new one, check if all the data is properly copied, then detach and delete the old one. Not all filesystems are resizable. + +Warning + +1. It is strongly recommended to backup the volume by creating Volume Snapshot before proceeding with extending the volume. + +Warning + +2. If you have a volume < 2TB and you want to extend it above 2TB, please do not follow below instructions. Instead please create a new volume, format it according to another article: [How to attach a volume to VM more than 2TB on Linux on CloudFerro Cloud](How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html), attach it to the VM, copy the data from the old volume to the new one, check if it is fully copied, detach and delete the old volume. + +You may use following guide to backup the volume: [How to create volume Snapshot and attach as Volume on Linux or Windows on CloudFerro Cloud](How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html) + +**Resizing the volume:** + +In this tutorial we will resize a 1GB volume to 5GB. + +First we need to extend the volume in Horizon. + +Let’s say that we have a 1GB volume attached to our instance as /dev/vdb: + +![vol1.png](../_images/vol1.png) + +And we have it mounted in our Linux machine as /dev/vdb1: + +``` +eouser@vm-john-01:~$ df -kh +Filesystem Size Used Avail Use% Mounted on +udev 1.9G 0 1.9G 0% /dev +tmpfs 394M 640K 393M 1% /run +/dev/vda1 15G 2.7G 12G 19% / +tmpfs 2.0G 0 2.0G 0% /dev/shm +tmpfs 5.0M 0 5.0M 0% /run/lock +tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup +tmpfs 394M 0 394M 0% /run/user/1001 +tmpfs 394M 0 394M 0% /run/user/1000 +/dev/vdb1 991M 2.6M 922M 1% /my_volume + +``` + +We already have some data on it, we don’t want to lose. + +First we need to unmount it in Linux: + +``` +eouser@vm-john-01:~$ sudo umount /dev/vdb1 + +``` + +Then detach it in Horizon by clicking “Manage Attachments” > “Detach Volume”: + +![vol2.png](../_images/vol2.png) + +![vol3.png](../_images/vol3.png) + +After detaching we will have the “Extend Volume” option available. + +![vol4.png](../_images/vol4.png) + +![vol5.png](../_images/vol5.png) + +We enter a new size, for example 5GB and click “Extend Volume”: + +![vol6.png](../_images/vol6.png) + +Our new volume size is 5GB. +Reattach it to your Virtual Machine again. +Now we need to extend our /dev/vdb partition in Linux. + +Expand the modified partition using **growpart** (and note the unusual syntax of separating the device name from the partition number): + +``` +eouser@vm-john-01:~$ sudo growpart /dev/vdb 1 +CHANGED: partition=1 start=2048 old: size=2095104 end=2097152 new: size=10483679 end=10485727 + +``` + +Next use resize2fs: + +``` +eouser@vm-john-01:~$ sudo resize2fs /dev/vdb1 +resize2fs 1.45.5 (07-Jan-2020) +Please run 'e2fsck -f /dev/vdb1' first. + +``` + +Most of the time a filesystem check will be recommended by the system. + +``` +eouser@vm-john-01:~$ sudo e2fsck -f /dev/vdb1 +e2fsck 1.45.5 (07-Jan-2020) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/vdb1: 11/65536 files (0.0% non-contiguous), 8859/261888 blocks + +``` + +After doing e2fsck we proceed with extending partition: + +``` +eouser@vm-john-01:~$ sudo resize2fs /dev/vdb1 +resize2fs 1.45.5 (07-Jan-2020) +Resizing the filesystem on /dev/vdb1 to 1310459 (4k) blocks. +The filesystem on /dev/vdb1 is now 1310459 (4k) blocks long. + +``` + +We can now mount our extended volume again. + +``` +eouser@vm-john-01:~$ sudo mount /dev/vdb1 + +``` + +``` +eouser@vm-john-01:~$ sudo df -kh +Filesystem Size Used Avail Use% Mounted on +udev 1.9G 0 1.9G 0% /dev +tmpfs 394M 640K 393M 1% /run +/dev/vda1 15G 2.7G 12G 19% / +tmpfs 2.0G 0 2.0G 0% /dev/shm +tmpfs 5.0M 0 5.0M 0% /run/lock +tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup +tmpfs 394M 0 394M 0% /run/user/1001 +tmpfs 394M 0 394M 0% /run/user/1000 +/dev/vdb1 5.0G 4.0M 4.7G 1% /my_volume + +``` + +The new size is now 5GB and the data that was previously there is intact. \ No newline at end of file diff --git a/docs/datavolume/How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..c2581ee --- /dev/null +++ b/docs/datavolume/How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,75 @@ +How to mount object storage in Linux on CloudFerro Cloud[](#how-to-mount-object-storage-in-linux-on-brand-name "Permalink to this headline") +============================================================================================================================================= + +S3 is a protocol for storing and retrieving data on and from remote servers. The user has their own S3 account and is identified by a pair of identifiers, which are called Access Key and Secret Key. These keys act as a username and password for your S3 account. + +Usually, for desktop computers we refer to files within a directory. In S3 terminology, file is called “object” and its name is called “key”. The S3 term for directory (or folder) is “bucket”. To mount object storage in your Linux computer, you will use command **s3fs**. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +Prerequisite No. 1 **Hosting** + +To use s3 protocol, you need a CloudFerro Cloud hosting account. It comes with graphical user interface called Horizon: but you can also use s3 commands from terminal in various operating systems. + +Prerequisite No. 2 **Valid EC2 credentials** + +The Access Key and Secret Key for access to an s3 account are also called the “EC2 credentials”. See article + +[How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html) + +At this point, you should have access to the cloud environment, using the OpenStack CLI client. It means that the command **openstack** is operational. + +Check your credentials and save them in a file[](#check-your-credentials-and-save-them-in-a-file "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +Check your credentials with the following command: + +``` +openstack ec2 credentials list + +``` + +where Access token and Secret token will be used in s3fs configuration: + +``` +echo Access_token:Secret_token > ~/.passwd-s3fs + +``` + +That command will store the credentials into a file called *passwd-s3fs*. Since it starts with a dot, it will be invisible to the usual searches under Linux. + +The file will be created in the present directory, but you can also create it anywhere else, for instance, in /etc/ folder and the like. + +Change permissions of the newly created file + +``` +chmod 600 .passwd-s3fs + +``` + +Code **600** means you can read and write the file or directory but that none of the other users on the local host will have access to it. + +Enable 3fs[](#enable-3fs "Permalink to this headline") +------------------------------------------------------- + +Uncomment “user\_allow\_other” in *fuse.conf* file as root + +``` +sudo nano /etc/fuse.conf + +``` + +Now you are ready to mount your object storage to your Linux system. The command looks like: + +``` +s3fs w-container-1 /local/mount/point - passwd_file=~/.passwd-s3fs -o url=https://s3.waw3-1.cloudferro.com -o use_path_request_style -o umask=0002 -o allow_other + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +If you want to access s3 files without mounting to the local computer, use command **s3cmd**. + +[How to access private object storage using S3cmd or boto3 on CloudFerro Cloud](../s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..81d7e5c --- /dev/null +++ b/docs/datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,47 @@ +How to move data volume between two VMs using OpenStack Horizon on CloudFerro Cloud[](#how-to-move-data-volume-between-two-vms-using-openstack-horizon-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================== + +Volumes are used to store data and those data can be accessed from a virtual machine to which the volume is attached. To access data stored on a volume from another virtual machine, you need to disconnect that volume from virtual machine to which it is currently connected, and connect it to another instance. + +This article uses the Horizon dashboard to transfer volumes between virtual machines which are in the same project. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Source virtual machine and volume** + +We assume that you have a virtual machine (which we will call *source* virtual machine) to which a volume is attached. + +No. 3 **Destination virtual machine** + +We also assume that you want to access the data stored on volume mentioned in Prerequisite No. 2 from another instance which is in the same project - we will call that instance *destination* virtual machine. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Ensure that the transfer is possible +> +> + Projects must be on the same cloud +> + Volume cannot be used for booting an operating system +> + File system compatibility +> + Making sure that the source virtual machine does not try to access the volume +> + Other volume and instance conditions for successful transfer +> * Shutting down the source virtual machine +> * Shutting down the source virtual machine using Horizon dashboard +> * Disconnecting volume +> * Attaching volume to destination virtual machine + +Some parts of some screenshots in this article are greyed out for privacy reasons. + +Ensure that the transfer is possible[](#ensure-that-the-transfer-is-possible "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Before the actual transfer, you have to examine the state of the volume and of the instances and conclude whether the transfer is possible right away or should you perform other operations first: + +### Projects must be on the same cloud[](#projects-must-be-on-the-same-cloud "Permalink to this headline") + +If the projects are not on the same cloud, do not use this article but see one of these articles instead: \ No newline at end of file diff --git a/docs/datavolume/How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html.md b/docs/datavolume/How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..691a186 --- /dev/null +++ b/docs/datavolume/How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html.md @@ -0,0 +1,21 @@ +How to restore volume from snapshot on CloudFerro Cloud[](#how-to-restore-volume-from-snapshot-on-brand-name "Permalink to this headline") +=========================================================================================================================================== + +In this article, you will learn how to restore volume from volume snapshot using Horizon dashboard or OpenStack CLI client. + +This can be achieved by creating a new volume from existing snapshot. You can then delete the previous snapshot and, optionally, previous volume. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with access to Horizon interface: + +No. 2 **A volume snapshot** + +You need to have a volume snapshot which you want to restore. + +No. 3 **OpenStack CLI client** + +If you want to interact with CloudFerro Cloud cloud using the OpenStack CLI client, you need to have it installed. Check one of these articles: \ No newline at end of file diff --git a/docs/datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html.md b/docs/datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..f3e4bb9 --- /dev/null +++ b/docs/datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html.md @@ -0,0 +1,36 @@ +Volume snapshot inheritance and its consequences on CloudFerro Cloud[](#volume-snapshot-inheritance-and-its-consequences-on-brand-name "Permalink to this headline") +===================================================================================================================================================================== + +Performing a volume snapshot is a common form of securing your data against loss. +There is nothing wrong with that, but you should remember what the consequences are. + +To illustrate the situation, we will present it on an example: +We have created a volume called “Volume A”. + +![volsnap1.png](../_images/volsnap1.png) + +Next we create an “SA” snapshot from the “VA” volume. + +![volsnap2.png](../_images/volsnap2.png) + +From the OpenStack dashboard we can create new volumes “Volume B” and “Volume C” based on the previously created snapshot “Snapshot A”. + +![volsnap3.png](../_images/volsnap3.png) + +At the moment we have two new volumes which are based on the “Snapshot A” snapshot. Suppose we no longer need the volume called “Volume A” and we want to delete it. + +![volsnap4.png](../_images/volsnap4.png) + +Unfortunately, its deletion will not be possible directly because to delete a given volume, we have to delete its snapshots. + +![volsnap5.png](../_images/volsnap5.png) + +So we must first delete the snapshot “Snapshot A” and then the volume “Volume A”. + +However, this will also not be possible due to the fact that the “Snapshot A” snapshot is the source for 2 volumes “Volume B” and “Volume C”. + +To delete a volume from which snapshots volumes were created, we must also delete all snapshots of this volume. + +In conclusion, when creating new volumes from a snapshot, remember about inheritance. Snapshot “Snapshot A” is a parent for the volumes (children) “Volume B” and “Volume C” and if we want to delete the volume “Volume A”, we have to do it from the youngest generation (Volume B and Volume C). + +Backups are another solution and they do not create such bonds as snapshots and may exist even after the volume from which the backup was created has been deleted. Please see [How to Backup an Instance and Download it to the Desktop on CloudFerro Cloud OpenStack Hosting](../openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/datavolume/datavolume.html.md b/docs/datavolume/datavolume.html.md new file mode 100644 index 0000000..7afc375 --- /dev/null +++ b/docs/datavolume/datavolume.html.md @@ -0,0 +1,2 @@ +DATA VOLUME[](#data-volume "Permalink to this headline") +========================================================= \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..940c682 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,4 @@ +Welcome to CloudFerro Cloud Documentation[](#welcome-to-cloudferro-cloud-documentation "Permalink to this headline") +===================================================================================================================== + +Contents: \ No newline at end of file diff --git a/docs/kubernetes/Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..04aac3a --- /dev/null +++ b/docs/kubernetes/Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,12 @@ +Automatic Kubernetes cluster upgrade on CloudFerro Cloud OpenStack Magnum[](#automatic-kubernetes-cluster-upgrade-on-brand-name-openstack-magnum "Permalink to this headline") +=============================================================================================================================================================================== + +Warning + +Upgradeable cluster templates are available on CloudFerro Cloud WAW4-1 region only at the moment of this writing. + +OpenStack Magnum clusters created in CloudFerro Cloud can be **automatically** upgraded to the next minor Kubernetes version. This feature is available for clusters starting with version 1.29 of Kubernetes. + +In this article we demonstrate an upgrade of a Magnum Kubernetes cluster from version 1.29 to version 1.30. + +What are we going to cover \ No newline at end of file diff --git a/docs/kubernetes/Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..eedfb6b --- /dev/null +++ b/docs/kubernetes/Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,353 @@ +Autoscaling Kubernetes Cluster Resources on CloudFerro Cloud OpenStack Magnum[](#autoscaling-kubernetes-cluster-resources-on-brand-name-openstack-magnum "Permalink to this headline") +======================================================================================================================================================================================= + +When **autoscaling of Kubernetes clusters** is turned on, the system can + +> * Add resources when the demand is high, or +> * Remove unneeded resources when the demand is low and thus keep the costs down. +> * The whole process can be automatic, helping the administrator concentrate on more important tasks at hand. + +This article explains various commands to resize or scale the cluster and will lead to a command to automatically create an autoscalable Kubernetes cluster for OpenStack Magnum. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Definitions of horizontal, vertical and nodes scaling +> * Define autoscaling when creating the cluster in Horizon interface +> * Define autoscaling when creating the cluster using the CLI +> * Get cluster template labels from Horizon interface +> * Get cluster template labels from the CLI + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Creating clusters with CLI** + +The article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) will introduce you to creation of clusters using a command line interface. + +No. 3 **Connect openstack client to the cloud** + +Prepare **openstack** and **magnum** clients by executing *Step 2 Connect OpenStack and Magnum Clients to Horizon Cloud* from article [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html) + +No. 4. **Resizing Nodegroups** + +Step 7 of article [Creating Additional Nodegroups in Kubernetes Cluster on CloudFerro Cloud OpenStack Magnum](Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html) shows example of resizing the nodegroups for autoscaling. + +No. 5 **Creating Clusters** + +Step 2 of article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) shows how to define master and worker nodes for autoscaling. + +There are three different autoscaling features that a Kubernetes cloud can offer: + +Horizontal Pod Autoscaler[](#horizontal-pod-autoscaler "Permalink to this headline") +------------------------------------------------------------------------------------- + +Scaling Kubernetes cluster horizontally means increasing or decreasing the number of running pods, depending on the actual demands at run time. Parameters to take into account are the usage of CPU and memory, as well as the desired minimum and maximum numbers of pod replicas. + +Horizontal scaling is also known as “scaling out” and is shorthened as HPA. + +Vertical Pod Autoscaler[](#vertical-pod-autoscaler "Permalink to this headline") +--------------------------------------------------------------------------------- + +Vertical scaling (or “scaling up”, VPA) is adding or subtracting resources to and from an existing machine. If more CPUs are needed, add them. When they are not needed, shut some of them down. + +Cluster Autoscaler[](#cluster-autoscaler "Permalink to this headline") +----------------------------------------------------------------------- + +HPA and VPA reorganize the usage of resources and the number of pods, however, there may come a time when the size of the system itself prevents from satisfying the demand. The solution is to autoscale the cluster itself, to increase or decrease the number of nodes on which the pods will run on. + +Once the number of nodes is adjusted, the pods and other resources need to rebalance themselves across the cluster, also automatically. The number of nodes acts as a physical barrier to the autoscaling of pods. + +All three models of autoscaling can be combined together. + +Define Autoscaling When Creating a Cluster[](#define-autoscaling-when-creating-a-cluster "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +You can define autoscaling parameters while defining a new cluster, using window called **Size** in the cluster creation wizard: + +![size_screen_filled.png](../_images/size_screen_filled.png) + +Specify a minimum and maximum number of worker nodes. If these values are 2 and 4 respectively, the cluster will have not less that 2 nodes and not more than 4 nodes at any time. If there is no traffic to the cluster, it will be automatically scaled to 2 nodes. In this example, the cluster can have 2, 3, or 4 nodes depending on the traffic. + +For the entire process of creating a Kubernetes cluster in Horizon, see Prerequisites No. 5. + +Warning + +If you decide to use NGINX Ingress option while defining a cluster, NGINX ingress will run as 3 replicas on 3 separate nodes. This will override the minimum number of nodes in Magnum autoscaler. + +Autoscaling Node Groups at Run Time[](#autoscaling-node-groups-at-run-time "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +The autoscaler in Magnum uses Node Groups. Node groups can be used to create workers with different flavors. The default-worker node group is automatically created when cluster is provisioned. Node groups have lower and upper limits of node count. This is the command to print them out for a given cluster: + +``` +openstack coe nodegroup show NoLoadBalancer default-worker -f json -c max_node_count -c node_count -c min_node_count + +``` + +The result would be: + +``` +{ + "node_count": 1, + "max_node_count": 2, + "min_node_count": 1 +} + +``` + +This works fine until you try to resize cluster beyond the limit set in node group. If you try to resize the above cluster to 12 nodes, like this: + +``` +openstack coe cluster resize NoLoadBalancer --nodegroup default-worker 12 + +``` + +you will get the following error: + +``` +Resizing default-worker outside the allowed range: min_node_count = 1, max_node_count = 2 (HTTP 400) (Request-ID: req-bbb09fc3-7df4-45c3-8b9b-fbf78d202ffd) + +``` + +To resolve this error, change *node\_group max\_node\_count* manually: + +``` +openstack coe nodegroup update NoLoadBalancer default-worker replace max_node_count=15 + +``` + +and then resize cluster to the desired value which was less that 15 in this example: + +openstack coe cluster resize NoLoadBalancer –nodegroup default-worker 12 + +If you repeat the first statement: + +``` +openstack coe nodegroup show NoLoadBalancer default-worker -f json -c max_node_count -c node_count -c min_node_count + +``` + +the result will now be with a corrected value: + +``` + { + "node_count": 12, + "max_node_count": 15, + "min_node_count": 1 +} + +``` + +How Autoscaling Detects Upper Limit[](#how-autoscaling-detects-upper-limit "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +The first version of Autoscaling would take the current upper limit of autoscaling in variable *node\_count* and add 1 to it. If the command to create a cluster were + +``` +openstack coe cluster create mycluster --cluster-template mytemplate --node-count 8 --master-count 3 + +``` + +that version of Autoscaler would take the value of **9** (counting as **8 + 1**). However, that procedure was limited to the default-worker node group only. + +The current Autoscaler can support multiple node groups by detecting the role of the node group: + +``` +openstack coe nodegroup show NoLoadBalancer default-worker -f json -c role + +``` + +and the result is + +``` +{ + "role": "worker" +} + +``` + +As long as the role is *worker* and *max\_node\_count* is greater than 0, the Autoscaler will try to scale the *default-worker* node group by adding **1** to *max\_node\_count*. + +Attention + +Any additional node group must include concrete *max\_node\_count* attribute. + +See Prerequisites No. 4 for detailed examples of using the **openstack coe nodegroup** family of commands. + +Autoscaling Labels for Clusters[](#autoscaling-labels-for-clusters "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +There are three labels for clusters that influence autoscaling: + +> * **auto\_scaling\_enabled** – if true, it is enabled +> * **min\_node\_count** – the minimal number of nodes +> * **max\_node\_count** – the maximal number of nodes, at any time. + +When defining cluster through the Horizon interface, you are actually setting up these cluster labels. + +![clusters.png](../_images/clusters.png) + +List clusters with **Container Infra** => **Cluster** and click on the name of the cluster. Under *Labels*, you will find the current value for **auto\_scaling\_enabled**. + +![enabled.png](../_images/enabled.png) + +If true, it is enabled, the cluster will autoscale. + +Create New Cluster Using CLI With Autoscaling On[](#create-new-cluster-using-cli-with-autoscaling-on "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +The command to create a cluster with CLI must encompass all of the usual parameters as well as **all of the labels** needed for the cluster to function. The peculiarity of the syntax is that label parameters must be one single string, without any blanks inbetween. + +This is what one such command could look like: + +``` +openstack coe cluster create mycluster +--cluster-template k8s-stable-1.23.5 +--keypair sshkey +--master-count 1 +--node-count 3 +--labels auto_scaling_enabled=true,autoscaler_tag=v1.22.0,calico_ipv4pool_ipip=Always,cinder_csi_plugin_tag=v1.21.0,cloud_provider_enabled=true,cloud_provider_tag=v1.21.0,container_infra_prefix=registry-public.cloudferro.com/magnum/,eodata_access_enabled=false,etcd_volume_size=8,etcd_volume_type=ssd,hyperkube_prefix=registry-public.cloudferro.com/magnum/,k8s_keystone_auth_tag=v1.21.0,kube_tag=v1.21.5-rancher1,master_lb_floating_ip_enabled=true + +``` + +If you just tried to copy and paste it into the terminal, you would get syntax errors. The end of the line is not allowed, the entire command must be one long string. To make your life easier, here is a version of the command that you *can* copy with success. + +Warning + +The line containing labels will be only partially visible on the screen, but once you paste it into the command line, the terminal software will execute it without problems. + +The command is: + +> **openstack coe cluster create mycluster –cluster-template k8s-stable-1.23.5 –keypair sshkey –master-count 1 –node-count 3 –labels auto\_scaling\_enabled=true,autoscaler\_tag=v1.22.0,calico\_ipv4pool\_ipip=Always,cinder\_csi\_plugin\_tag=v1.21.0/,cloud\_provider\_enabled=true,cloud\_provider\_tag=v1.21.0,container\_infra\_prefix=registry-public.cloudferro.com/magnum/,eodata\_access\_enabled=false,etcd\_volume\_size=8,etcd\_volume\_type=ssd,hyperkube\_prefix=registry-public.cloudferro.com/magnum/,k8s\_keystone\_auth\_tag=v1.21.0,kube\_tag=v1.21.5-rancher1,master\_lb\_floating\_ip\_enabled=true,min\_node\_count=2,max\_node\_count=4** + +The name will be *mycluster*, one master node and three worker nodes in the beginning. + +Note + +It is mandatory to set up the maximal number of nodes in autoscaling. If not specified, the **max\_node\_count** will default to 0, and there will be no autoscaling at all for the particular nodegroup. + +This is the result after the creation: + +![cluster_successful.png](../_images/cluster_successful.png) + +Three worker node addresses are active: **10.0.0.102**, **10.0.0.27**, and **10.0.0.194**. + +There is no traffic to the cluster so the autoscaling immediately kicked in. A minute or two after the creation was finished, the number of worker nodes fell down by one, to addresses **10.0.0.27** and **10.0.0.194** – that is autoscaling at work. + +Nodegroups With Worker Role Will Be Automatically Autoscalled[](#nodegroups-with-worker-role-will-be-automatically-autoscalled "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Autoscaler automaticaly detects all new nodegroups with “worker” role assigned. +The “worker” role is assigned by default if not specified. The maximum number of nodes must be specified as well. + +First see which nodegroups are present for cluster *k8s-cluster*. The command is + +``` +openstack coe nodegroup list k8s-cluster -c name -c node_count -c status -c role + +``` + +Switch **-c** denotes which column to show, disregarding all other columns that are not listed in the command. You will see a table with columns *name*, *node\_count*, *status* and *role*, which means that columns such as *uuid*, *flavor\_id* and *image\_id* will not take valueable space onscreen. The result is table with only the four columns that are relevant to adding nodegroupes with roles: + +![nodegroup_list_1.png](../_images/nodegroup_list_1.png) + +Now add and print a nodegroup without role: + +``` +openstack coe nodegroup create k8s-cluster nodegroup-without-role --node-count 1 --min-nodes 1 --max-nodes 5 + +openstack coe nodegroup list k8s-cluster -c name -c node_count -c status -c role + +``` + +Since the role was not specified, a default value of “worker” was assigned to node group *nodegroup-without-role*. Since the system is set up to automatically autoscale nodegroups with *worker* role, if you add nodegroup without a role, it will autoscale. + +![autoscale_with_role.png](../_images/autoscale_with_role.png) + +Now add a node group called *nodegroup-with-role* and the name of the role will be *custom*: + +``` +openstack coe nodegroup create k8s-cluster nodegroup-with-role --node-count 1 --min-nodes 1 --max-nodes 5 --role custom + +openstack coe nodegroup list k8s-cluster -c name -c node_count -c status -c role + +``` + +![nodegroup_with_added_role.png](../_images/nodegroup_with_added_role.png) + +That will add a nodegroup but will not autoscale it on its own, as there is no *worker* role specified for the nodegroup. + +Finally, add a nodegroup called *nodegroup-with-role-2* which will have two roles defined in one statement, that is, both *custom* and *worker*. Since at least one of the roles is *worker*, it will autoscale automatically. + +``` +openstack coe nodegroup create k8s-cluster nodegroup-with-role-2 --node-count 1 --min-nodes 1 --max-nodes 5 --role custom,worker + +openstack coe nodegroup list k8s-cluster -c name -c node_count -c status -c role + +``` + +![autoscale_custom_worker.png](../_images/autoscale_custom_worker.png) + +Cluster **k8s-cluster** now has **8** nodes: + +![all_nodes.png](../_images/all_nodes.png) + +You can delete these three clusters with the following set of commands: + +``` +openstack coe nodegroup delete k8s-cluster nodegroup-with-role + +openstack coe nodegroup delete k8s-cluster nodegroup-with-role-2 + +openstack coe nodegroup delete k8s-cluster nodegroup-without-role + +``` + +Once again, see the result: + +``` +openstack coe nodegroup list k8s-cluster -c name -c node_count -c status -c role + +``` + +![state_again.png](../_images/state_again.png) + +How to Obtain All Labels From Horizon Interface[](#how-to-obtain-all-labels-from-horizon-interface "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +Use **Container Infra** => **Clusters** and click on the cluster name. You will get plain text in browser, just copy the rows under **Labels** and paste them to the text editor of your choice. + +![copy.png](../_images/copy.png) + +In text editor, manually remove line ends and make one string without breaks and carriage returns, then paste it back to the command. + +How To Obtain All Labels From the CLI[](#how-to-obtain-all-labels-from-the-cli "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +There is a special command which will produce labels from a cluster: + +``` +openstack coe cluster template show k8s-stable-1.23.5 -c labels -f yaml + +``` + +This is the result: + +![labels.png](../_images/labels.png) + +That is *yaml* format, as specified by the **-f** parameter. The rows represent label values and your next action is to create one long string without line breaks as in the previous example, then form the CLI command. + +Use Labels String When Creating Cluster in Horizon[](#use-labels-string-when-creating-cluster-in-horizon "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------- + +The long labels string can also be used when creating the cluster manually, i.e. from the Horizon interface. The place to insert those labels is described in *Step 4 Define Labels* in Prerequisites No. 2. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Autoscaling is similar to autohealing of Kubernetes clusters and both bring automation to the table. They also guarantee that the system will autocorrect as long as it is within its basic parameters. Use autoscaling of cluster resources as much as you can! \ No newline at end of file diff --git a/docs/kubernetes/Backup-of-Kubernetes-Cluster-using-Velero.html.md b/docs/kubernetes/Backup-of-Kubernetes-Cluster-using-Velero.html.md new file mode 100644 index 0000000..d599b74 --- /dev/null +++ b/docs/kubernetes/Backup-of-Kubernetes-Cluster-using-Velero.html.md @@ -0,0 +1,801 @@ +Backup of Kubernetes Cluster using Velero[](#backup-of-kubernetes-cluster-using-velero "Permalink to this headline") +===================================================================================================================== + +What is Velero[](#what-is-velero "Permalink to this headline") +--------------------------------------------------------------- + +[Velero](https://velero.io) is the official open source project from VMware. It can back up all Kubernetes API objects and persistent volumes from the cluster on which it is installed. Backed up objects can be restored on the same cluster, or on a new one. Using a package like Velero is essential for any serious development in the Kubernetes cluster. + +In essence, you create object store under OpenStack, either using Horizon or Swift module of **openstack** command and then save cluster state into it. Restoring is the same in reverse – read from that object store and save it to a Kubernetes cluster. + +Velero has its own CLI command system so it is possible to automate creation of backups using cron jobs. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Getting EC2 Client Credentials +> * Adjusting “values.yaml”, the configuration file +> * Creating namespace called *velero* for precise access to the Kubernetes cluster +> * Installing Velero with a Helm chart +> * Installing and deleting backups using Velero +> * Example 1 Basics of Restoring an Application +> * Example 2 Snapshot of Restoring an Application + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +The resources that you require and use will reflect on the state of your account wallet. Check your account statistics at . + +No. 2 **How to Access Kubernetes cluster post-deployment** + +We shall also assume that you have one or more Kubernetes clusters ready and accessible via a **kubectl** command: + +[How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +The result of that article will be setting up of system variable **KUBECONFIG**, which points to the configuration file for access to the Kubernetes cloud. A typical command will be: + +``` +export KUBECONFIG=/home/username/Desktop/kubernetes/k8sdir/config + +``` + +In case this is the first time you are using that particular config file, make it more secure by executing the following command as well: + +``` +chmod 600 /home/username/Desktop/kubernetes/k8sdir/config + +``` + +No. 3 **Handling Helm** + +To install Velero, we shall use Helm: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html). + +No. 4 **An object storage S3 bucket available** + +To create one, you can access object storage with Horizon interface or CLI. + +Horizon commands +: [How to use Object Storage on CloudFerro Cloud](../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html). + +CLI +: You can also use command such as + +``` +openstack container + +``` + +to work with object storage. For more information see [How to access object storage using OpenStack CLI on CloudFerro Cloud](../openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html) + +Either way, we shall assume that there is a container called “bucketnew”: + +![bucketnew_created.png](../_images/bucketnew_created.png) + +Supply your own unique name while working through this article. + +Before Installing Velero[](#before-installing-velero "Permalink to this headline") +----------------------------------------------------------------------------------- + +We shall install Velero on Ubuntu 22.04; using other Linux distributions would be similar. + +Update and upgrade your Ubuntu environment: + +``` +sudo apt update && sudo apt upgrade + +``` + +It will be necessary to have access to a Kubernetes cluster, v1.16 or later, with DNS and container networking enabled. For more information on supported Kubernetes versions, see Velero [compatibility matrix](https://github.com/vmware-tanzu/velero#velero-compatabilty-matrix). + +### Installation step 1 Getting EC2 client credentials[](#installation-step-1-getting-ec2-client-credentials "Permalink to this headline") + +First fetch EC2 credentials from OpenStack. They are necessary to access private bucket (container). Generate them on your own by executing the following commands: + +``` +openstack ec2 credentials create +openstack ec2 credentials list + +``` + +Save somewhere the *Access Key* and the *Secret Key*. They will be needed in the next step, in which you set up a Velero configuration file. + +### Installation step 2 Adjust the configuration file - “values.yaml”[](#installation-step-2-adjust-the-configuration-file-values-yaml "Permalink to this headline") + +Now create or adjust a configuration file for Velero. Use text editor of your choice to create that file. On MacOS or Linux, for example, you can use **nano**, like this: + +``` +sudo nano values.yaml + +``` + +Use configuration file provided below. Fill in the required fields, which are marked with **##**: + +**values.yaml** + +WAW4-1WAW3-1WAW3-2FRA1-2 + +> ``` +> initContainers: +> - name: velero-plugin-for-aws +> image: velero/velero-plugin-for-aws:v1.4.0 +> imagePullPolicy: IfNotPresent +> volumeMounts: +> - mountPath: /target +> name: plugins +> +> configuration: +> provider: aws +> backupStorageLocation: +> provider: aws +> name: ## enter name of backup storage location (could be anything) +> bucket: ## enter name of bucket created in openstack +> default: true +> config: +> region: default +> s3ForcePathStyle: true +> s3Url: ## enter URL of object storage (for example "https://s3.waw4-1.cloudferro.com") +> credentials: +> secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. +> cloud: | +> [default] +> aws_access_key_id= +> aws_secret_access_key= +> ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +> snapshotsEnabled: false +> deployRestic: true +> restic: +> podVolumePath: /var/lib/kubelet/pods +> privileged: true +> schedules: +> mybackup: +> disabled: false +> schedule: "0 6,18 * * *" ## choose time, when scheduled backups will be make. +> template: +> ttl: "240h" ## choose ttl, after which the backups will be removed. +> snapshotVolumes: false +> +> ``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: ## enter name of backup storage location (could be anything) + bucket: ## enter name of bucket created in openstack + default: true + config: + region: waw3-1 + s3ForcePathStyle: true + s3Url: ## enter URL of object storage (for example "https://s3.waw3-1.cloudferro.com") +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= + aws_secret_access_key= + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 6,18 * * *" ## choose time, when scheduled backups will be make. + template: + ttl: "240h" ## choose ttl, after which the backups will be removed. + snapshotVolumes: false + +``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: ## enter name of backup storage location (could be anything) + bucket: ## enter name of bucket created in openstack + default: true + config: + region: default + s3ForcePathStyle: true + s3Url: ## enter URL of object storage (for example "https://s3.waw3-2.cloudferro.com") +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= + aws_secret_access_key= + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 6,18 * * *" ## choose time, when scheduled backups will be make. + template: + ttl: "240h" ## choose ttl, after which the backups will be removed. + snapshotVolumes: false + +``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: ## enter name of backup storage location (could be anything) + bucket: ## enter name of bucket created in openstack + default: true + config: + region: default + s3ForcePathStyle: true + s3Url: ## enter URL of object storage (for example "https://s3.fra1-2.cloudferro.com") +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= + aws_secret_access_key= + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 6,18 * * *" ## choose time, when scheduled backups will be make. + template: + ttl: "240h" ## choose ttl, after which the backups will be removed. + snapshotVolumes: false + +``` + +Paste the content to the configuration file **values.yaml** and save. + +Example of an already configured file: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: velerobackupnew + bucket: bucketnew + default: true + config: + region: default + s3ForcePathStyle: true + s3Url: https://s3.waw4-1.cloudferro.com +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= c4b4ee62a18f4e0ba23f71629d2038e1x + aws_secret_access_key= dee1581dac214d3dsa34037e826f9148 + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 * * *" + template: + ttl: "168h" + snapshotVolumes: false + +``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: velerobackupnew + bucket: bucketnew + default: true + config: + region: waw3-1 + s3ForcePathStyle: true + s3Url: https://s3.waw3-1.cloudferro.com +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= c4b4ee62a18f4e0ba23f71629d2038e1x + aws_secret_access_key= dee1581dac214d3dsa34037e826f9148 + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 * * *" + template: + ttl: "168h" + snapshotVolumes: false + +``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: velerobackupnew + bucket: bucketnew + default: true + config: + region: default + s3ForcePathStyle: true + s3Url: https://s3.waw3-2.cloudferro.com +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= c4b4ee62a18f4e0ba23f71629d2038e1x + aws_secret_access_key= dee1581dac214d3dsa34037e826f9148 + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 * * *" + template: + ttl: "168h" + snapshotVolumes: false + +``` + +``` +initContainers: +- name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:v1.4.0 + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + +configuration: + provider: aws + backupStorageLocation: + provider: aws + name: velerobackupnew + bucket: bucketnew + default: true + config: + region: default + s3ForcePathStyle: true + s3Url: https://s3.fra1-2.cloudferro.com +credentials: + secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret. + cloud: | + [default] + aws_access_key_id= c4b4ee62a18f4e0ba23f71629d2038e1x + aws_secret_access_key= dee1581dac214d3dsa34037e826f9148 + ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents. +snapshotsEnabled: false +deployRestic: true +restic: + podVolumePath: /var/lib/kubelet/pods + privileged: true +schedules: + mybackup: + disabled: false + schedule: "0 * * *" + template: + ttl: "168h" + snapshotVolumes: false + +``` + +### Installation step 3 Creating namespace[](#installation-step-3-creating-namespace "Permalink to this headline") + +Velero must be installed in an eponymous namespace, *velero*. This is the command to create it: + +``` +kubectl create namespace velero +namespace/velero created + +``` + +### Installation step 4 Installing Velero with a Helm chart[](#installation-step-4-installing-velero-with-a-helm-chart "Permalink to this headline") + +Here are the commands to install Velero by means of a Helm chart: + +``` +helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts + +``` + +The output is: + +``` +"vmware-tanzu" has been added to your repositories + +``` + +The following command will install velero onto the cluster: + +``` +helm install vmware-tanzu/velero --namespace velero --version 2.28 -f values.yaml --generate-name + +``` + +The output will look like this: + +![installation_of_velero.png](../_images/installation_of_velero.png) + +To see the version of Velero that is actually installed, use: + +``` +helm list --namespace velero + +``` + +Note the name used, **velero-1721031498**, and we are going to use it in the rest of the article. In your case, note the correct velero name and swap value of **1721031498** with it. + +Here is how to check that Velero is up and running: + +``` +kubectl get deployment/velero-1721031498 -n velero + +``` + +The output will be similar to this: + +``` +NAME READY UP-TO-DATE AVAILABLE AGE +velero-1721031498 1/1 1 1 5m30s + +``` + +Check that the secret has been created: + +``` +kubectl get secret/velero-1721031498 -n velero + +``` + +The result is: + +``` +NAME TYPE DATA AGE +velero-1721031498 Opaque 1 3d1h + +``` + +### Installation step 5 Installing Velero CLI[](#installation-step-5-installing-velero-cli "Permalink to this headline") + +The final step is to install Velero CLI – Command Line Interface suitable for working from the terminal window on your operating system. + +Download the client specified for your operating system from: , using **wget**. Here we are downloading version + +> **velero-v1.9.1-linux-amd64.tar.gz** + +but it is recommended to download the latest version. In that case, change the name of the **tar.gz** file accordingly. + +``` +wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.1/velero-v1.9.1-linux-amd64.tar.gz + +``` + +Extract the tarball: + +``` +tar -xvf velero-v1.9.1-linux-amd64.tar.gz + +``` + +This is the expected result: + +``` +velero-v1.9.1-linux-amd64/LICENSE +velero-v1.9.1-linux-amd64/examples/README.md +velero-v1.9.1-linux-amd64/examples/minio +velero-v1.9.1-linux-amd64/examples/minio/00-minio-deployment.yaml +velero-v1.9.1-linux-amd64/examples/nginx-app +velero-v1.9.1-linux-amd64/examples/nginx-app/README.md +velero-v1.9.1-linux-amd64/examples/nginx-app/base.yaml +velero-v1.9.1-linux-amd64/examples/nginx-app/with-pv.yaml +velero-v1.9.1-linux-amd64/velero + +``` + +Move the extracted **velero** binary to somewhere in your $PATH (/usr/local/bin for most users): + +``` +cd velero-v1.9.1-linux-amd64 +# System might force using sudo +sudo mv velero /usr/local/bin +# check if velero is working +velero version + +``` + +![velero_version_working.png](../_images/velero_version_working.png) + +After these operations, you should be allowed to use **velero** commands. For help how to use them, execute: + +``` +velero help + +``` + +Working with Velero[](#working-with-velero "Permalink to this headline") +------------------------------------------------------------------------- + +So far, we have + +> * created an object store named “bucketnew” and +> * told velero to use it through the **bucket:** parameter in values.yaml file. + +Velero will create another object store called *backups* under “bucketnew” and then continue creating object stores for particular backups. For example, the following command will add object store called **mybackup2**: + +> ``` +> velero backup create mybackup2 +> Backup request "mybackup2" submitted successfully. +> +> ``` + +Here is what it will look like in Horizon: + +![installed_mybackup2.png](../_images/installed_mybackup2.png) + +Let us add two other backups. The first should backup all api objects in namespace *velero*: + +``` +velero backup create mybackup3 --include-namespaces velero + +``` + +The second will backup all api objects in default namespace + +``` +velero backup create mybackup5 --include-namespaces default +Backup request "mybackup4" submitted successfully. + +``` + +This the object store structure after these three backups: + +![three_backups_mybackup.png](../_images/three_backups_mybackup.png) + +You can also use velero CLI command to list the existing backups: + +``` +velero backup get + +``` + +This is the result in terminal window: + +![three_backups_mybackup.png](../_images/three_backups_mybackup.png) + +Example 1 Basics of Restoring an Application[](#example-1-basics-of-restoring-an-application "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +Let us now demonstrate how to restore a Kubernetes application. Let us first clone one example app from GitHub. Execute this: + +``` +git clone https://github.com/vmware-tanzu/velero.git +Cloning into 'velero'... +Resolving deltas: 100% (27049/27049), done. +cd velero + +``` + +Start the sample nginx app: + +``` +kubectl apply -f examples/nginx-app/base.yaml +kubectl apply -f base.yaml +namespace/nginx-example unchanged +deployment.apps/nginx-deployment unchanged +service/my-nginx unchanged + +``` + +Create a backup: + +``` +velero backup create nginx-backup --include-namespaces nginx-example +Backup request "nginx-backup" submitted successfully. + +``` + +This is what the backup of **nginx-backup** looks like in Horizon: + +![nginx-backup.png](../_images/nginx-backup.png) + +Simulate a disaster: + +``` +kubectl delete namespaces nginx-example +# Wait for the namespace to be deleted +namespace "nginx-example" deleted + +``` + +Restore your lost resources: + +``` +velero restore create --from-backup nginx-backup +Restore request "nginx-backup-20220728013338" submitted successfully. +Run `velero restore describe nginx-backup-20220728013338` or `velero restore logs nginx-backup-20220728013338` for more details. + +velero backup get +NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR +backup New 0 0 n/a +nginx-backup New 0 0 n/a + +``` + +Example 2 Snapshot of restoring an application[](#example-2-snapshot-of-restoring-an-application "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +Start the sample nginx app: + +``` +kubectl apply -f examples/nginx-app/with-pv.yaml +namespace/nginx-example created +persistentvolumeclaim/nginx-logs created +deployment.apps/nginx-deployment created +service/my-nginx created + +``` + +Create a backup with PV snapshotting: + +``` +velero backup create nginx-backup-vp --include-namespaces nginx-example +Backup request "nginx-backup" submitted successfully. +Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details. + +``` + +Simulate a disaster: + +``` +kubectl delete namespaces nginx-example +namespace "nginx-example" deleted + +``` + +Important + +Because the default [reclaim policy](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming) for dynamically-provisioned PVs is “Delete”, these commands should trigger your cloud provider to delete the disk that backs up the PV. Deletion is asynchronous, so this may take some time. + +Restore your lost resources: + +``` +velero restore create --from-backup nginx-backup-vp +Restore request "nginx-backup-20220728015234" submitted successfully. +Run `velero restore describe nginx-backup-20220728015234` or `velero restore logs nginx-backup-20220728015234` for more details. + +``` + +Delete a Velero backup[](#delete-a-velero-backup "Permalink to this headline") +------------------------------------------------------------------------------- + +There are two ways to delete a backup made by Velero. + +Delete backup custom resource only +: ``` + kubectl delete backup -n + + ``` + + will delete the backup custom resource only and will not delete any associated data from object/block storage + +Delete all data in object/block storage +: ``` + velero backup delete + + ``` + + will delete the backup resource including all data in object/block storage + +Removing Velero from the cluster[](#removing-velero-from-the-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +### Uninstall Velero[](#uninstall-velero "Permalink to this headline") + +To uninstall Velero release: + +``` +helm uninstall velero-1721031498 --namespace velero + +``` + +### To delete Velero namespace[](#to-delete-velero-namespace "Permalink to this headline") + +``` +kubectl delete namespace velero + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Now that Velero is up and running, you can integrate it into your routine. It will be useful in all classical backups scenarios – for disaster recovery, cluster and namespace migration, testing and development, application rollbacks, compliance and auditing and so on. Apart from these broad use cases, Velero will help with specific Kubernetes cluster tasks for backing up, such as: + +> * backing up and restoring deployments, service, config maps and secrets, +> * selective backups, say, only for specific namespaces or label selectors, +> * volume shapshots using cloud provider APIs (AWS, Azure, GCP etc.) +> * snapshots of persistent volumes for point-in-time recovery +> * saving backup data to AWS S3, Google Cloud Storage, Azure Blob Storage etc. +> * integration with **kubectl** command so that Custom Resource Definitions (CRDs) are used to define backup and restore configuration. \ No newline at end of file diff --git a/docs/kubernetes/CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html.md b/docs/kubernetes/CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html.md new file mode 100644 index 0000000..729222e --- /dev/null +++ b/docs/kubernetes/CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html.md @@ -0,0 +1,242 @@ +CI/CD pipelines with GitLab on CloudFerro Cloud Kubernetes - building a Docker image[](#ci-cd-pipelines-with-gitlab-on-brand-name-kubernetes-building-a-docker-image "Permalink to this headline") +=================================================================================================================================================================================================== + +GitLab provides an isolated, private code registry and space for collaboration on code by teams. It also offers a broad range of code deployment automation capabilities. In this article, we will explain how to automate building a Docker image of your app. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Add your public key to GitLab and access GitLab from your command line +> * Create project in GitLab and add sample application code +> * Define environment variables with your DockerHub coordinates in GitLab +> * Create pipeline to build your app’s Docker image using Kaniko +> * Trigger pipeline build + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Kubernetes cluster** + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Local version of GitLab available** + +Your local instance of GitLab is available and properly accessible by your GitLab user. + +In this article we assume the setup according to this article [Install GitLab on CloudFerro Cloud Kubernetes](Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html). If you use a different instance of GitLab, there can be some differences e.g. where certain functionalities are located in the GUI. + +In this article, we shall be using **gitlab.mysampledomain.info** as the gitlab instance. Be sure to replace it with your own domain. + +No. 4 **git CLI operational** + +**git** command installed locally. You may use it with [GitHub](https://github.com/git-guides/install-git), [GitLab](https://docs.gitlab.com/ee/topics/git/how_to_install_git/) and other source control platforms based on **git**. + +No. 5 **Account at DockerHub** + +> [Access to your DockerHub](https://hub.docker.com/) (or another container image registry). + +No. 6 **Using Kaniko** + +[kaniko](https://docs.gitlab.com/ee/ci/docker/using_kaniko.html) +is a tool to build container images based on a provided Dockerfile. For more elaborate overview of kaniko refer to its documentation. + +No. 7 **Private and public keys available** + +To connect to our GitLab instance we need a combination of a private and a public key. You can use any key pair, one option is to use OpenStack Horizon to create one. For reference see: + +See [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html) + +Here, we use the key pair to connect to GitLab instance that we previously installed in Prerequisite No. 3. + +Step 1 Add your public key to GitLab and access GitLab from your command line[](#step-1-add-your-public-key-to-gitlab-and-access-gitlab-from-your-command-line "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +In order to access your GitLab instance from the command line, GitLab uses SSH-based authentication. To ensure your console uses these keys for authentication by default, ensure your keys are stored in the **~/.ssh** folder and are called **id\_rsa** (private key) and **id\_rsa.pub** (public key). + +The public key should then be added to the authorized keys in GitLab GUI. To add the public key, click on your avatar icon: + +![image-2024-5-10_16-28-4.png](../_images/image-2024-5-10_16-28-4.png) + +Then scroll to “Preferences”, choose “SSH Keys” from the left menu and paste the contents of your public key into the “Key” field. + +![image-2024-4-26_15-4-3.png](../_images/image-2024-4-26_15-4-3.png) + +If the GitLab instance you are using is hosted, say, on domain **mysampledomain.info**, you can use a command like this + +``` +ssh -T [email protected] + +``` + +to verify that you have access to GitLab from CLI interface. + +You should see an output similar to the following: + +![image-2024-5-10_16-30-8.png](../_images/image-2024-5-10_16-30-8.png) + +Step 2 Create project in GitLab and add sample application code[](#step-2-create-project-in-gitlab-and-add-sample-application-code "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------- + +We will first add a sample application in GitLab. This is a minimal Python-Flask application, its code can be downloaded from this CloudFerro Cloud [GitHub repository accompanying this Knowledge Base](https://github.com/CloudFerro/K8s-samples/tree/main/HelloWorld-Docker-image-Flask). + +As a first step in this section, we will initiate the GitLab remote origin. Login to GitLab GUI and enter the default screen, click on button “New Project”, then “Create blank project”. It will transfer you to the view below. + +![image-2024-4-26_16-58-33.png](../_images/image-2024-4-26_16-58-33.png) + +In that view, project URL will be pre-filled and corresponding to the URL of your GitLab instance. +In the place denoted with a red rectangle, you should enter your user name; usually, it will be **root** but can be anything else. +If there already are some users defined in GitLab, their names will appear in a drop-down menu. + +![drop-down-menu.png](../_images/drop-down-menu.png) + +Enter your preferred project name and slug, in our case “GitLabCI Sample” and “GitLabCI-sample”, respectively. Choose the visibility level to your preference. Uncheck box “Initialize repository with a README”, because we will initiate the repository from the existing code. (We are not initializing the repo, we are only establishing the project in the origin.) + +After submitting the “Create project” form, you will receive a list of commands to work with your repo. Review them and switch to the CLI. Clone the entire CloudFerro K8s samples repo, then extract the sub-folder called *HelloWorld-Docker-image-Flask*. For clarity, we rename its contents to a new folder, **GitLabCI-sample**. Use + +``` +mkdir ~/GitLabCI-sample + +``` + +if this is the first time you are working through this article, so the folder would be ready for the following set of commands: + +``` +git clone https://github.com/CloudFerro/K8s-samples +mv ~/K8s-samples/HelloWorld-Docker-image-Flask/* ~/GitLabCI-sample +rm K8s-samples/ -rf + +``` + +After the above sequence of steps, we have folder **GitLabCI-sample** with 3 files: + +> * **app.py** which is our Python Flask application code, +> * a **Dockerfile** and +> * the dependencies file **requirements.txt**. + +We can then **cd** into this folder, initialize git repo, commit locally and push to the remote with the following commands (replace domain and username): + +``` +cd GitLabCI-sample +git init +git remote add origin [email protected]:myusername/GitLabCI-sample.git +git add . +git commit -m "First commit" +git push origin master + +``` + +Most likely, the user name **myusername** here will be just **root**. + +When we enter GitLab GUI, we can see that our changes are committed: + +![image-2024-4-26_17-57-57.png](../_images/image-2024-4-26_17-57-57.png) + +Step 3 Define environment variables with your DockerHub coordinates in GitLab[](#step-3-define-environment-variables-with-your-dockerhub-coordinates-in-gitlab "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +We want to create a CI/CD pipeline that will, upon a new commit, build a Docker image of our app and push it to Docker Hub container registry. Let us use environment variables in GitLab to enable connection to the Docker registry. Use the following keys and values: + +``` +CI_COMMIT_REF_SLUG=latest +CI_REGISTRY=https://index.docker.io/v1/ +CI_REGISTRY_IMAGE=index.docker.io/yourdockerhubuser/gitlabci-sample +CI_REGISTRY_USER=yourdockerhubuser +CI_REGISTRY_PASSWORD=yourdockerhubrepo + +``` + +The first two, **CI\_COMMIT\_REF\_SLUG** and **CI\_REGISTRY** are hardcoded for DockerHub. The other three are: + +CI\_REGISTRY\_IMAGE +: The name of Docker image to be created. Enter your user name for Docker Hub site (*yourdockerhubuser*). If, for instance, the user name is *paultur*, the image in Docker registry will be **/paultur/gitlabci-sample**, as seen at the end of this article. + +CI\_REGISTRY\_USER +: Enter *yourdockerhubuser* which, again, is your user name in Docker Hub. + +CI\_REGISTRY\_PASSWORD +: Enter \* *yourdockerhubrepo*, which can be your account password or a specially created *access token*. To create one such token, see option **Account Settings** –> **Security** in Docker site: + + ![new_access_token.png](../_images/new_access_token.png) + +Back to GitLab UI, from menu **Settings** in project view, go to **CI/CD** submenu: + +![select_ci_cd_option.png](../_images/select_ci_cd_option.png) + +Scroll down to the section “Variables”and fill in the respective forms. In the GUI, this will look similar to this: + +![image-2024-4-29_12-56-40.png](../_images/image-2024-4-29_12-56-40.png) + +Now that the values of variables are set up, we will use them in our CI/CD pipeline. + +Step 4 Create a pipeline to build your app’s Docker image using Kaniko[](#step-4-create-a-pipeline-to-build-your-app-s-docker-image-using-kaniko "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +The CI/CD pipeline that we are creating in GitLab will have only one job that + +> * builds the image and +> * pushes it to the Docker image registry. + +In real life scenarios, pipelines would also include additional jobs e.g. related to unit or integration tests. + +GitLab recognizes that a repository/project is configured to implement a CI/CD pipeline by the presence of the **.gitlab-ci.yml** file at the root of the project. One could apply the CI/CD to the project also from GitLab GUI (CI/CD menu entry → Pipelines), using one of the provided default templates. However the result will be, similarly, adding a specifically configured **.gitlab-ci.yml** file to the root of the project. + +Now create now a **.gitlab-ci.yml** file with the contents as below and place it into the folder **GitLabCI-sample**. The file contains the configuration of our pipeline and defines a single job called **docker\_image\_build**. + +**.gitlab-ci.yml** + +``` +docker_image_build: + image: + name: gcr.io/kaniko-project/executor:v1.14.0-debug + entrypoint: [""] + script: + - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\" }}}" > /kaniko/.docker/config.json + - >- + /kaniko/executor + --context "${CI_PROJECT_DIR}" + --cache=false + --dockerfile "${CI_PROJECT_DIR}/Dockerfile" + --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}" + +``` + +When changes to our project are committed to GitLab, the CI/CD pipeline is triggered to run automatically. + +The jobs are executed by GitLab runner. If you are using GitLab instance by following Prerequisite No. 3 **Local version of GitLab available**, the default runner will have already been deployed in the cluster. In this case, the runner deploys a short-lived pod dedicated to running this specific pipeline. One of the containers running in the pod is based on Kaniko image and is used to build the Docker image of our app. + +There are two key commands in the *script* key and they run when the Kaniko container starts. Both will take values after the environment variables we have previously entered into GitLab. + +Fill in and save the contents of a standardized configuration file +: The first command fills in and saves the contents of **config.json**, which is a standardized configuration file used for authenticating to DockerHub. + +Build and publish the container image to DockerHub +: The second command builds and publishes the container image to DockerHub. + +Step 5 Trigger pipeline build[](#step-5-trigger-pipeline-build "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +A commit triggers the pipeline to run. After adding the file, publish changes to the repository with the following set of commands: + +``` +git add . +git commit -m "Add .gitlab-ci.yml" +git push origin master + +``` + +After this commit, if we switch to CI/CD screen of our project, we should see that the pipeline first is in running status, and completed afterwards: + +![image-2024-4-29_14-13-1.png](../_images/image-2024-4-29_14-13-1.png) + +Also when browsing our Docker registry, the image is published: + +![image-2024-4-29_14-16-12.png](../_images/image-2024-4-29_14-16-12.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Add your unit and integration tests to this pipeline. They can be added as additional steps in the **gitlab-ci.yml** file. A complete reference can be found here: \ No newline at end of file diff --git a/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e7d12ff --- /dev/null +++ b/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,235 @@ +Configuring IP Whitelisting for OpenStack Load Balancer using Horizon and CLI on CloudFerro Cloud[](#configuring-ip-whitelisting-for-openstack-load-balancer-using-horizon-and-cli-on-brand-name "Permalink to this headline") +=============================================================================================================================================================================================================================== + +This guide explains how to configure IP whitelisting (**allowed\_cidrs**) on an existing OpenStack Load Balancer using Horizon and CLI commands. The configuration will limit access to your cluster through load balancer. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Prepare Your Environment +> * Whitelist the load balancer via the CLI + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **List of IP addresses/ranges to whitelist** + +This is the list of IP addresses that you want the load balancer to be able to listen to. + +In this article, we will use the following two addresses to whitelist: + +> * 10.0.0.0/8 +> * 10.95.255.0/24 + +No. 3 **Python Octavia Client** + +To operate Load Balancers with CLI, the Python Octavia Client (python-octaviaclient) is required. It is a command-line client for the OpenStack Load Balancing service. Install the load-balancer (Octavia) plugin with the following command from the Terminal window, on Ubuntu 22.04: + +``` +pip install python-octaviaclient + +``` + +Or, if you have virtualenvwrapper installed: + +``` +mkvirtualenv python-octaviaclient +pip install python-octaviaclient + +``` + +### Prepare Your Environment[](#prepare-your-environment "Permalink to this headline") + +First of all, you have to find **id** of your load balancer and its listener. + +#### Horizon:[](#horizon "Permalink to this headline") + +To find a load balancer **id**, go to **Project** >> **Network** >> **Load Balancers** and find that one which is associated with your cluster (its name will be with prefix of your cluster name). + +![whitelisting_again-1.png](../_images/whitelisting_again-1.png) + +Click on load balancer name (in this case `lb-testing-ih347dstxyl2-api_lb_fixed-w2im3obvdv2p-loadbalancer_with_flavor-ykcmf6vvphld`) then go to Listeners pane. There you will have a listener associated with that load balancer. + +![whitelisting_again-2.png](../_images/whitelisting_again-2.png) + +#### CLI[](#cli "Permalink to this headline") + +To use CLI to find the listener, you have to know the following two cluster parameters: + +> * **Stack ID** +> * **Cluster ID** + +You can find them from Horizon commands **Container Infra** –> **Clusters** and then click on the name of the cluster: + +![whitelisting-loadbalancer-4.png](../_images/whitelisting-loadbalancer-4.png) + +At the bottom of the window, find the Stack ID: + +![whitelisting-loadbalancer-5.png](../_images/whitelisting-loadbalancer-5.png) + +Now execute the commands: + +``` +openstack coe cluster show \ +-f value -c stack_id \ + + +``` + +To find **LB\_ID** + +``` +openstack stack resource list \ +-n 5 -c resource_name -c physical_resource_id \ +| grep loadbalancer_with_flavor \ +| loadbalancer_with_flavor \ +| + +``` + +With that information, now we can check our **listener\_id**; it is to this component that we will attach the whitelist: + +``` +openstack loadbalancer \ +show 2d6b335f-fb05-4496-8593-887f7e2c49cf \ +-c listeners \ +-f value \ + + +``` + +### Whitelist the load balancer via the CLI[](#whitelist-the-load-balancer-via-the-cli "Permalink to this headline") + +We now have the listener and the IP addresses which will be whitelisted. This is the command that will set up the whitelisting: + +``` +openstack loadbalancer listener set \ +--allowed-cidr 10.0.0.0/8 \ +--allowed-cidr 10.95.255.0/24 \ + + +``` + +![whitelisting_again-3.png](../_images/whitelisting_again-3.png) + +State of Security: Before and After[](#state-of-security-before-and-after "Permalink to this headline") +-------------------------------------------------------------------------------------------------------- + +Before implementing IP whitelisting, the load balancer accepts traffic from all sources. After completing the procedure: + +> * Only specified IPs can access the load balancer. +> * Unauthorized access attempts are denied. + +Verification Tools[](#verification-tools "Permalink to this headline") +----------------------------------------------------------------------- + +Various tools can ensure the protection is installed and active: + +livez +: Kubernetes monitoring endpoint. + +nmap +: (free): For port scanning and access verification. + +curl +: (free): To confirm access control from specific IPs. + +Wireshark +: (free): For packet-level analysis. + +### Testing using curl and livez[](#testing-using-curl-and-livez "Permalink to this headline") + +Here is how we could test it: + +``` +curl -k https://:6443/livez?verbose + +``` + +That command assumes that you have + +curl +: installed and operational + + +: which you can see through Horizon commands **API Access** –> **View Credentials** + +livez +: which is a piece of software which will show what happens with the load balancer. + +This would be a typical response before changes: + +``` +curl -k https://:6443/livez?verbose +[+]ping ok +[+]log ok +[+]etcd ok +[+]poststarthook/start-kube-apiserver-admission-initializer ok +[+]poststarthook/generic-apiserver-start-informers ok +[+]poststarthook/priority-and-fairness-config-consumer ok +[+]poststarthook/priority-and-fairness-filter ok +[+]poststarthook/storage-object-count-tracker-hook ok +[+]poststarthook/start-apiextensions-informers ok +[+]poststarthook/start-apiextensions-controllers ok +[+]poststarthook/crd-informer-synced ok +[+]poststarthook/start-system-namespaces-controller ok +[+]poststarthook/bootstrap-controller ok +[+]poststarthook/rbac/bootstrap-roles ok +[+]poststarthook/scheduling/bootstrap-system-priority-classes ok +[+]poststarthook/priority-and-fairness-config-producer ok +[+]poststarthook/start-cluster-authentication-info-controller ok +[+]poststarthook/start-kube-apiserver-identity-lease-controller ok +[+]poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-legacy-token-tracking-controller ok +[+]poststarthook/aggregator-reload-proxy-client-cert ok +[+]poststarthook/start-kube-aggregator-informers ok +[+]poststarthook/apiservice-registration-controller ok +[+]poststarthook/apiservice-status-available-controller ok +[+]poststarthook/kube-apiserver-autoregistration ok +[+]autoregister-completion ok +[+]poststarthook/apiservice-openapi-controller ok +[+]poststarthook/apiservice-openapiv3-controller ok +[+]poststarthook/apiservice-discovery-controller ok +livez check passed + +``` + +And, this would be a typical response after the changes: + +``` +curl -k https://:6443/livez?verbose -m 5 +curl: (28) Connection timed out after 5000 milliseconds + +``` + +Whitelisting prevents traffic from all IP addresses apart from those that are allowed by **--allowed-cidr**. + +### Testing with nmap[](#testing-with-nmap "Permalink to this headline") + +To test with **nmap**: + +``` +nmap -p + +``` + +### Testing with curl directly[](#testing-with-curl-directly "Permalink to this headline") + +To test with **curl**: + +``` +curl http:// + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can wrap up this procedure with Terraform and apply to a larger number of load balancers. See [Configuring IP Whitelisting for OpenStack Load Balancer using Terraform on CloudFerro Cloud](Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html) + +Also, compare with [Implementing IP Whitelisting for Load Balancers with Security Groups on CloudFerro Cloud](Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..93ef84b --- /dev/null +++ b/docs/kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html.md @@ -0,0 +1,274 @@ +Configuring IP Whitelisting for OpenStack Load Balancer using Terraform on CloudFerro Cloud[](#configuring-ip-whitelisting-for-openstack-load-balancer-using-terraform-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================================== + +This guide explains how to configure IP whitelisting (**allowed\_cidrs**) on an existing OpenStack Load Balancer using Terraform. The configuration will limit access to your cluster through load balancer. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Get necessary load balancer and cluster data from the Prerequisites +> * Create the Terraform Configuration +> * Import Existing Load Balancer Listener +> * Run terraform +> * Test and verify that protection of load balancer via whitelisting works + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Basic parameters already defined for whitelisting** + +See article [Configuring IP Whitelisting for OpenStack Load Balancer using Horizon and CLI on CloudFerro Cloud](Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html) for definition of basic notions and parameters. + +No. 3 **Terraform installed** + +You will need version 1.50 or higher to be operational. + +For complete introduction and installation of Terrafom on OpenStack see article [Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud](../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html) + +No. 4 **Unrestricted application credentials** + +You need to have OpenStack application credentials with unrestricted checkbox. Check article [How to generate or use Application Credentials via CLI on CloudFerro Cloud](../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html) + +The first part of that article describes how to have installed OpenStack client and connect it to the cloud. With that provision, the quickest way to create an unrestricted application credential is to apply the command like this: + +``` +openstack application credential create cred_unrestricted --unrestricted + +``` + +That would create an unrestricted credential called **cred\_unrestricted**. + +You can also use Horizon commands **Identity** –> **Application Credentials** –> **Create Application Credential** and check the appropriate box on: + +![whitelisting-loadbalancer-1.png](../_images/whitelisting-loadbalancer-1.png) + +Log in to your account using this unrestricted credential. + +Prepare Your Environment[](#prepare-your-environment "Permalink to this headline") +----------------------------------------------------------------------------------- + +Work through article in Prerequisite No. 2 from which we will derive all the input parameters, using Horizon and CLI commands. + +Also, authenticate through application credential you got from Prerequisite No. 4. + +Configure Terraform for whitelisting[](#configure-terraform-for-whitelisting "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Instead of performing the whitelisting procedure manually, we can use Terraform and store the procedure in the remote repo. + +Create file **openstack\_auth.sh** + +``` +export OS_AUTH_URL="https://your-openstack-url:5000/v3" +export OS_PROJECT_NAME="your-project" +export OS_USERNAME="your-username" +export OS_PASSWORD="your-password" +export OS_REGION_NAME="your-region" + +``` + +Create a new directory for your Terraform configuration and create the following files: + +Note + +This example is created for brand new Magnum cluster. You might have to adjust it a bit to suit your needs. + +Create Terraform file: + +**main.tf** + +``` +terraform { + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "1.47.0" + } + } +} + +provider "openstack" { + use_octavia = true # Required for Load Balancer v2 API +} + +``` + +**variables.tf** + +``` +variable "ID_OF_LOADBALANCER" { + type = string + description = "ID of the existing OpenStack Load Balancer" +} + +variable "allowed_cidrs" { + type = list(string) + description = "List of IP ranges in CIDR format to whitelist" +} + +``` + +**terraform.tfvars** + +``` +ID_OF_LOADBALANCER = "your-lb-id" +allowed_cidrs = [ + "10.0.0.1/32", # Single IP address + "192.168.1.0/24", # IP range + "172.16.0.0/16" # Larger subnet +] + +``` + +**lb.tf** + +``` +resource "openstack_lb_listener_v2" "k8s_api_listener" { + loadbalancer_id = var.ID_OF_LOADBALANCER + allowed_cidrs = var.allowed_cidrs + protocol_port = "6443" + protocol = "TCP" +} + +``` + +Import Existing Load Balancer Listener[](#import-existing-load-balancer-listener "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +Since Terraform 1.5 can import your resource in declarative way. + +**import.tf** + +``` +import { + to = openstack_lb_listener_v2.k8s_api_listener + id = "your-listener-id" +} + +``` + +Or you can do it in an imperative way: + +``` +terraform import openstack_lb_listener_v2.k8s_api_listener "" + +``` + +Run Terraform[](#run-terraform "Permalink to this headline") +------------------------------------------------------------- + +**Terraform Execute** + +``` +terraform init +terraform plan -out=generated_listener.tf +terraform apply generated_listener.tf + +``` + +**Example output:** + +**teraform output** + +``` +Terraform apply generated_listener.tf +openstack_lb_listener_v2.k8s_api_listener: Preparing import... [id=bbf39f1c-6936-4344-9957-7517d4a979b6] +openstack_lb_listener_v2.k8s_api_listener: Refreshing state... [id=bbf39f1c-6936-4344-9957-7517d4a979b6] + +Terraform used the selected providers to generate the following execution +plan. Resource actions are indicated with the following symbols: + ~ update in-place + +Terraform will perform the following actions: + + # openstack_lb_listener_v2.k8s_api_listener will be updated in-place + # (imported from "bbf39f1c-6936-4344-9957-7517d4a979b6") + ~ resource "openstack_lb_listener_v2" "k8s_api_listener" { + admin_state_up = true + ~ allowed_cidrs = [ + + "10.0.0.1/32", + ] + connection_limit = -1 + default_pool_id = "5991eacc-5869-4205-a646-d27646ccb216" + default_tls_container_ref = null + description = null + id = "bbf39f1c-6936-4344-9957-7517d4a979b6" + insert_headers = {} + loadbalancer_id = "2d6b335f-fb05-4496-8593-887f7e2c49cf" + name = "lb-testing-ih347dstxyl2-api_lb_fixed-w2im3obvdv2p-listener-t36tocd4onxk" + protocol = "TCP" + protocol_port = 6443 + region = "" + sni_container_refs = [] + tenant_id = "" + timeout_client_data = 50000 + timeout_member_connect = 5000 + timeout_member_data = 50000 + timeout_tcp_inspect = 0 + + - timeouts {} + } + +Plan: 1 to import, 0 to add, 1 to change, 0 to destroy. + +``` + +Tests[](#tests "Permalink to this headline") +--------------------------------------------- + +By default, Magnum LB does not have any access restrictions. + +Before changes: + +``` +curl -k https://:6443/livez?verbose +[+]ping ok +[+]log ok +[+]etcd ok +[+]poststarthook/start-kube-apiserver-admission-initializer ok +[+]poststarthook/generic-apiserver-start-informers ok +[+]poststarthook/priority-and-fairness-config-consumer ok +[+]poststarthook/priority-and-fairness-filter ok +[+]poststarthook/storage-object-count-tracker-hook ok +[+]poststarthook/start-apiextensions-informers ok +[+]poststarthook/start-apiextensions-controllers ok +[+]poststarthook/crd-informer-synced ok +[+]poststarthook/start-system-namespaces-controller ok +[+]poststarthook/bootstrap-controller ok +[+]poststarthook/rbac/bootstrap-roles ok +[+]poststarthook/scheduling/bootstrap-system-priority-classes ok +[+]poststarthook/priority-and-fairness-config-producer ok +[+]poststarthook/start-cluster-authentication-info-controller ok +[+]poststarthook/start-kube-apiserver-identity-lease-controller ok +[+]poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-legacy-token-tracking-controller ok +[+]poststarthook/aggregator-reload-proxy-client-cert ok +[+]poststarthook/start-kube-aggregator-informers ok +[+]poststarthook/apiservice-registration-controller ok +[+]poststarthook/apiservice-status-available-controller ok +[+]poststarthook/kube-apiserver-autoregistration ok +[+]autoregister-completion ok +[+]poststarthook/apiservice-openapi-controller ok +[+]poststarthook/apiservice-openapiv3-controller ok +[+]poststarthook/apiservice-discovery-controller ok +livez check passed + +``` + +**After:** + +``` +curl -k https://:6443/livez?verbose -m 5 +curl: (28) Connection timed out after 5000 milliseconds + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Compare with [Implementing IP Whitelisting for Load Balancers with Security Groups on CloudFerro Cloud](Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/kubernetes/Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..75995bb --- /dev/null +++ b/docs/kubernetes/Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html.md @@ -0,0 +1,165 @@ +Create and access NFS server from Kubernetes on CloudFerro Cloud[](#create-and-access-nfs-server-from-kubernetes-on-brand-name "Permalink to this headline") +============================================================================================================================================================= + +In order to enable simultaneous read-write storage to multiple pods running on a Kubernetes cluster, we can use an NFS server. + +In this guide we will create an NFS server on a virtual machine, create file share on this server and demonstrate accessing it from a Kubernetes pod. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Set up an NFS server on a VM +> * Set up a share folder on the NFS server +> * Make the share available +> * Deploy a test pod on the cluster + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +The resources that you require and use will reflect on the state of your account wallet. Check your account statistics at . + +No. 2 **Familiarity with Linux and cloud management** + +We assume you know the basics of Linux and CloudFerro Cloud cloud management: + +* Creating, accessing and using virtual machines + [How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud](../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html) + +* Creating security groups [How to use Security Groups in Horizon on CloudFerro Cloud](../cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html) + +* Attaching floating IPs [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html) + +No. 3 **A running Kubernetes cluster** + +You will also need a Kubernetes cluster to try out the commands. To create one from scratch, see [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **kubectl access to the Kubernetes cloud** + +As usual when working with Kubernetes clusters, you will need to use the **kubectl** command: [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +1. Set up NFS server on a VM[](#set-up-nfs-server-on-a-vm "Permalink to this headline") +---------------------------------------------------------------------------------------- + +As a prerequisite to create an NFS server on a VM, first from the Network tab in Horizon create a security group allowing ingress traffic from port **2049**. + +Then create an Ubuntu VM from Horizon. During the *Network* selection dialog, connect the VM to the network of your Kubernetes cluster. This ensures that cluster nodes have access to the NFS server over private network. Then add that security group with port **2049** open. + +![nfs_server_2049.png](../_images/nfs_server_2049.png) + +When the VM is created, you can see that it has private address assigned. For this occasion, let the private address be **10.0.0.118**. Take note of this address to later use it in NFS configuration. + +Set up floating IP on the VM server, just to enable SSH to this VM. + +2. Set up a share folder on the NFS server[](#set-up-a-share-folder-on-the-nfs-server "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------- + +SSH to the VM, then run: + +``` +sudo apt-get update +sudo apt-get install nfs-kernel-server + +``` + +In the NFS server VM create a share folder: + +``` +sudo mkdir /mnt/myshare + +``` + +Change the owner of the share so that *nobody* is owner. Thus any user on the client can access the share folder. More restrictive settings can be applied. + +``` +sudo chown nobody:nogroup /mnt/myshare + +``` + +Also change the permissions of the folder, so that anyone can modify the files: + +``` +sudo chmod 777 /mnt/myshare + +``` + +Edit the */etc/exports* file and add the following line: + +``` +/mnt/myshare 10.0.0.0/24(rw,sync,no_subtree_check) + +``` + +This indicates that all nodes on the cluster network can access this share, with subfolders, in read-write mode. + +3. Make the share available[](#make-the-share-available "Permalink to this headline") +-------------------------------------------------------------------------------------- + +Run the below command to make the share available: + +``` +sudo exportfs -a + +``` + +Then restart the NFS server with: + +``` +sudo systemctl restart nfs-kernel-server + +``` + +Exit from the NFS server VM. + +4. Deploy a test pod on the cluster[](#deploy-a-test-pod-on-the-cluster "Permalink to this headline") +------------------------------------------------------------------------------------------------------ + +Ensure you can access your cluster with **kubectl**. Have a file *test-pod.yaml* with the following contents: + +**test-pod.yaml** + +``` +apiVersion: v1 +kind: Pod +metadata: + name: test-pod + namespace: default +spec: + containers: + - image: nginx + name: test-container + volumeMounts: + - mountPath: /my-nfs-data + name: test-volume + volumes: + - name: test-volume + nfs: + server: 10.0.0.118 + path: /mnt/myshare + +``` + +The NFS server block refers to private IP address of the NFS server machine, which is on our cluster network. Apply the *yaml* manifest with: + +``` +kubectl apply -f test-pod.yaml + +``` + +We can then enter the shell of the *test-pod* with the below command: + +``` +kubectl exec -it test-pod -- sh + +``` + +and see that the *my-nfs-data* folder got mounted properly: + +![image2023-6-1_17-6-3.png](../_images/image2023-6-1_17-6-3.png) + +To verify, create a file *testfile* in this folder, then exit the container. You can then SSH back to the NFS server and verify that *testfile* is available in */mnt/myshare* folder. + +![image2023-6-1_17-8-5.png](../_images/image2023-6-1_17-8-5.png) \ No newline at end of file diff --git a/docs/kubernetes/Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..0b714ec --- /dev/null +++ b/docs/kubernetes/Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,254 @@ +Creating Additional Nodegroups in Kubernetes Cluster on CloudFerro Cloud OpenStack Magnum[](#creating-additional-nodegroups-in-kubernetes-cluster-on-brand-name-openstack-magnum "Permalink to this headline") +=============================================================================================================================================================================================================== + +The Benefits of Using Nodegroups[](#the-benefits-of-using-nodegroups "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +A *nodegroup* is a group of nodes from a Kubernetes cluster that have the same configuration and run the user’s containers. One and the same cluster can have various nodegroups within it, so instead of creating several independent clusters, you may create only one and then separate the groups into the nodegroups. + +A nodegroup separates the roles within the cluster and can + +> * limit the scope of damage if a given group is compromised, +> * regulate the number of API requests originating from a certain group, and +> * create scopes of privileges to specific node types and related workloads. + +Other uses of nodegroup roles also include: + +> * for testing purposes, +> * if your Kubernetes environment is small on resources, you can create a minimal Kubernetes cluster and later on add nodegroups and thus enhance the number of control and worker nodes. +> * Nodes in a group can be created, upgraded and deleted individually, without affecting the rest of the cluster. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * The structure of command **openstack coe nodelist** +> * How to produce manageable output from **nodelist** set of commands +> * How to **list** what nodegroups are available in a cluster +> * How to **show** the contents of one particular *nodegroup* in a cluster +> * How to **create** a new *nodegroup* +> * How to **delete** an existing *nodegroup* +> * How to **update** *nodegroups* +> * How to resize a nodegroup +> * The benefits of using nodegroups in Kubernetes clusters + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Creating clusters with CLI** + +The article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) will introduce you to creation of clusters using a command line interface. + +No. 3 **Connect openstack client to the cloud** + +Prepare **openstack** and **magnum** clients by executing *Step 2 Connect OpenStack and Magnum Clients to Horizon Cloud* from article [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html) + +No. 4 **Check available quotas** + +Before creating additional node groups check the state of the resources with Horizon commands **Computer** => **Overview**. See [Dashboard Overview – Project Quotas And Flavors Limits on CloudFerro Cloud](../cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html). + +Nodegroup Subcommands[](#nodegroup-subcommands "Permalink to this headline") +----------------------------------------------------------------------------- + +Once you create a Kubernetes cluster on OpenStack Magnum, there are five *nodegroup* commands at your disposal: + +``` +openstack coe nodegroup create + +openstack coe nodegroup delete + +openstack coe nodegroup list + +openstack coe nodegroup show + +openstack coe nodegroup update + +``` + +With this, you can repurpose the cluster to include various images, change volume access, set up max and min values for the number of nodes and so on. + +Step 1 Access the Current State of Clusters and Their Nodegroups[](#step-1-access-the-current-state-of-clusters-and-their-nodegroups "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Here is which clusters are available in the system: + +``` +openstack coe cluster list --max-width 120 + +``` + +![present_clusters.png](../_images/present_clusters.png) + +The default process of creating Kubernetes clusters on OpenStack Magnum produces two nodegroups, **default-master** and **default-worker**. Use commands + +``` +openstack coe nodegroup list kubelbtrue + +openstack coe nodegroup list k8s-cluster + +``` + +to list default nodegroups for those two clusters, *kubelbtrue* and *k8s-cluster*. + +![listing_nodegroups.png](../_images/listing_nodegroups.png) + +The **default-worker** node group cannot be removed or reconfigured so plan ahead when creating the base cluster. + +Step 2 How to Create a New Nodegroup[](#step-2-how-to-create-a-new-nodegroup "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +In this step you learn about the parameters available for the **nodegroup create** command. This is the general structure: + +``` +openstack coe nodegroup create [-h] +[--docker-volume-size ] +[--labels ] +[--node-count ] +[--min-nodes ] +[--max-nodes ] +[--role ] +[--image ] +[--flavor ] +[--merge-labels] + + +``` + +You will now create a nodegroup of two members, it will be called *testing*, the role will be called *test*, and add it to the cluster *k8s-cluster*: + +``` +openstack coe nodegroup create \ +--node-count 2 \ +--role test \ +k8s-cluster testing + +``` + +Then use the command + +``` +openstack coe nodegroup list k8s-cluster + +``` + +to list the nodegroups twice. The first time, it will be in status of creating, the second time, after a few seconds, it will have been created already. + +![created_new_nodegroup.png](../_images/created_new_nodegroup.png) + +In Horizon, use command **Orchestration** => **Stacks** to list the mechanisms that create new instances. In this case, the stack looks like this: + +![stacks_creations.png](../_images/stacks_creations.png) + +Still in Horizon, click on commands **Contaner Infra** => **Clusters** => **k8s-clusters** and see that there are now five nodes in total: + +![cluster_inside.png](../_images/cluster_inside.png) + +Step 3 Using **role** to Filter Nodegroups in the Cluster[](#step-3-using-role-to-filter-nodegroups-in-the-cluster "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------- + +It is possible to filter node groups according to the role. Here is the command to show only the *test* nodegroup: + +``` +openstack coe nodegroup list k8s-cluster --role test + +``` + +![role_test.png](../_images/role_test.png) + +Several node groups can share the same role name. + +The roles can be used to schedule the nodes when using the **kubectl** command directly on the cluster. + +Step 4 Show Details of the Nodegroup Created[](#step-4-show-details-of-the-nodegroup-created "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +Command **show** presents the details of a nodegroup in various formats – *json*, *table*, *shell*, *value* or *yaml*. The default is *table* but use parameter **–max-width** to limit the number of columns in it: + +``` +openstack coe nodegroup show --max-width 80 k8s-cluster testing + +``` + +![table_testing.png](../_images/table_testing.png) + +Step 5 Delete the Existing Nodegroup[](#step-5-delete-the-existing-nodegroup "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +In this step you shall try to create a nodegroup with small footprint: + +``` +openstack coe nodegroup create \ +--node-count 2 \ +--role test \ +--image cirros-0.4.0-x86_64-2 \ +--flavor eo1.xsmall \ +k8s-cluster cirros + +``` + +After one hour, the command was cancelled and the creation has failed. The resources will, however, stay frozen in the system so here is how to delete them. + +One way is to use the CLI **delete** subcommand, like this: + +``` +openstack coe nodegroup delete k8s-cluster cirros + +``` + +The status will be changed to DELETE\_IN\_PROGRESS. + +Another way is to find the instances of those created nodes and delete them through the Horizon interface. Find the existing instances with commands **Compute** => **Instance** and filter by *Instance Name*, with text *k8s-cluster-cirros-*. It may look like this: + +![filtered_cirros.png](../_images/filtered_cirros.png) + +and then delete them by clicking on red button **Delete Instances**. + +You will get a confirmation text in cloud in the upper right corner. + +Regardless of the way, the instances will not be deleted immediately, but rather *scheduled* to be deleted in some near future. + +The default master and worker node groups cannot be deleted but all the others can. + +Step 6 Update the Existing Nodegroup[](#step-6-update-the-existing-nodegroup "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +In this step you will directly update the existing nodegroup, rather than adding and deleting them in a row. The example command is: + +``` +openstack coe nodegroup update k8s-cluster testing replace min_node_count=1 + +``` + +Instead of **replace**, it is also possible to use verbs **add** and **delete**. + +In the above example, you are setting up the minimum value of nodes to 1. (Previously it was **0** as parameter **min\_node\_count** was not specified and its default value is **0**.) + +Step 7 Resize the Nodegroup[](#step-7-resize-the-nodegroup "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Resizing the *nodegroup* is similar to resizing the cluster, with the addition of parameter **–nodegroup**. Currently, the number of nodes in group *testing* is 2. Make it **1**: + +``` +openstack coe cluster resize k8s-cluster --nodegroup testing 1 + +``` + +To see the result, apply the command + +``` +openstack coe nodegroup list --max-width 120 k8s-cluster + +``` + +and get: + +![nodegroup_resized.png](../_images/nodegroup_resized.png) + +Cluster cannot be scaled outside of min-nodes/max-nodes set when nodegroup was created. + +Here is what the state of the networks looks like after all these changes (commands **Network** => **Network Topology** => **Small** in Horizon interface): + +![nodegroups_network_graph.png](../_images/nodegroups_network_graph.png) \ No newline at end of file diff --git a/docs/kubernetes/Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html.md b/docs/kubernetes/Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html.md new file mode 100644 index 0000000..5b32bc2 --- /dev/null +++ b/docs/kubernetes/Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html.md @@ -0,0 +1,185 @@ +Default Kubernetes cluster templates in CloudFerro Cloud Cloud[](#default-kubernetes-cluster-templates-in-brand-name-cloud "Permalink to this headline") +========================================================================================================================================================= + +In this article we shall list Kubernetes cluster templates available on CloudFerro Cloud and explain the differences among them. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * List available templates on your cloud +> * Explain the difference between *calico* and *cilium* network drivers +> * How to choose proper template +> * Overview and benefits of *localstorage* templates +> * Example of creating *localstorage* template using HMD and HMAD flavors + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Private and public keys** + +To create a cluster, you will need an available SSH key pair. If you do not have one already, follow this article to create it in the OpenStack dashboard: [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +No. 3 **Documentation for standard templates** + +Documentation for all **1.23.16** drivers is [here](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#v12316). + +Documentation for *localstorage* templates: + +> | | | +> | --- | --- | +> | k8s-stable-localstorage-1.21.5 | [Kubernetes release 1.21](https://kubernetes.io/blog/2021/04/08/kubernetes-1-21-release-announcement/) | +> | k8s-stable-localstorage-1.22.5 | [Kubernetes release 1.22](https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/) | +> | k8s-stable-localstorage-1.23.5 | [Kubernetes release 1.23](https://kubernetes.io/blog/2021/12/07/kubernetes-1-23-release-announcement/) | + +No. 4 **How to create Kubernetes clusters** + +The general procedure is explained in [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 5 **Using vGPU in Kubernetes clusters** + +If template name contains “vgpu”, this template can be used to create so-called “vGPU-first” clusters. + +To learn how to set up vGPU in Kubernetes clusters on CloudFerro Cloud cloud, see [Deploying vGPU workloads on CloudFerro Cloud Kubernetes](Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html). + +Templates available on your cloud[](#templates-available-on-your-cloud "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +The exact number of available default Kubernetes cluster templates depends on the cloud you choose to work with. + +WAW4-1 +: These are the default Kubernetes cluster templates on WAW4-1 cloud: + + ![waw4-1-cluster-templates-2.png](../_images/waw4-1-cluster-templates-2.png) + +WAW3-1 +: These are the default Kubernetes cluster templates on WAW3-1 cloud: + + ![waw3-1-default.png](../_images/waw3-1-default.png) + +WAW3-2 +: Default templates for WAW3-2 cloud: + + ![waw3-2-default_templates.png](../_images/waw3-2-default_templates.png) + +FRA1-2 +: Default templates for FRA1-2 cloud: + + ![fra1-2-default-template.png](../_images/fra1-2-default-template.png) + +The converse is also true, you may want to select the cloud that you want to use according to the type of cluster that you would want to use. For instance, you would have to select WAW3-1 cloud if you wanted to use vGPU on your cluster. + +How to choose a proper template[](#how-to-choose-a-proper-template "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +**Standard templates** + +Standard templates are general in nature and you can use them for any type of Kubernetes cluster. Each will produce a working Kubernetes cluster on CloudFerro Cloud OpenStack Magnum hosting. The default network driver is *calico*. Template that does not specify calico, k8s-1.23.16-v1.0.3, and is identical to the template that does specify *calico* in its name. Both are placed in the left column in the following table: + +| calico | cilium | +| --- | --- | +| k8s-1.23.16-v1.0.3 | k8s-1.23.16-cilium-v1.0.3 | +| k8s-1.23.16-calico-v1.0.3 | | + + + +Standard templates can also use vGPU hardware if available in the cloud. Using vGPU with Kubernetes clusters is explained in Prerequisite No. 5. + +**Templates with vGPU** + +| calico vGPU | cilium vGPU | +| --- | --- | +| k8s-1.23.16-vgpu-v1.0.0 | k8s-1.23.16-cilium-vgpu-v1.0.0 | +| k8s-1.23.16-calico-vgpu-v1.0.0 | | + + + +Again, the templates in the left column are identical. + +If the application does not require a great many operations, then a standard template should be sufficient. + +You can also dig deeper and choose the template according to the the network plugin used. + +### Network plugins for Kubernetes clusters[](#network-plugins-for-kubernetes-clusters "Permalink to this headline") + +Kubernetes cluster templates at CloudFerro Cloud cloud use *calico* or *cilium* plugins for controlling network traffic. Both are [CNI](https://www.cncf.io/projects/kubernetes/) compliant. *Calico* is the default plugin, meaning that if the template name does not specify the plugin, the *calico* driver is used. If the template name specifies *cilium* then, of course, the *cilium* driver is used. + +### Calico (the default)[](#calico-the-default "Permalink to this headline") + +[Calico](https://projectcalico.docs.tigera.io/about/about-calico) uses BGP protocol to move network packets towards IP addresses of the pods. *Calico* can be faster then its competitors but its most remarkable feature is support for *network policies*. With those, you can define which pods can send and receive traffic and also manage the security of the network. + +*Calico* can apply policies to multiple types of endpoints such as pods, virtual machines and host interfaces. It also supports cryptographics identity. *Calico* policies can be used on its own or together with the Kubernetes network policies. + +### Cilium[](#cilium "Permalink to this headline") + +[Cilium](https://cilium.io/) is drawing its power from a technology called *eBPF*. It exposes programmable hooks to the network stack in Linux kernel. *eBPF* uses those hooks to reprogram Linux runtime behaviour without any loss of speed or safety. There also is no need to recompile Linux kernel in order to become aware of events in Kubernetes clusters. In essence, *eBPF* enables Linux to watch over Kubernetes and react appropriately. + +With *Cilium*, the relationships amongst various cluster parts are as follows: + +> * pods in the cluster (as well as the *Cilium* driver itself) are using *eBPF* instead of using Linux kernel directly, +> * kubelet uses *Cilium* driver through the CNI compliance and +> * the *Cilium* driver implements network policy, services and load balancing, flow and policy logging, as well as computing various metrics. + +Using *Cilium* especially makes sense if you require fine-grained security controls or need to reduce latency in large Kubernetes clusters. + +Overview and benefits of *localstorage* templates[](#overview-and-benefits-of-localstorage-templates "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +Compared to standard templates, the *localstorage* templates may be a better fit for *resources intensive* apps. + +NVMe stands for *Nonvolatile Memory Express* and is a newer storage access and transport protocol for flash and solid-state drives (SSDs). *localstorage* templates provision the cluster with Virtual Machine flavors which have NVMe storage available. + +Each cluster contains an instance of **etcd** volume, which serves as its external database. Using NVMe storage will speed up access to **etcd** and it will, by definition, speed up cluster operations. + +Applications such as day trading, personal finances, AI and the similar, may have so many transactions that using *localstorage* templates may become a viable option. + +In WAW3-1 cloud, virtual machine flavors with NVMe have the prefix of HMD and they are resource-intensive: + +``` +openstack flavor list ++--------------+--------+------+-----------+-------+ +| Name | RAM | Disk | Ephemeral | VCPUs | ++--------------+--------+------+-----------+-------+ +| hmd.xlarge | 65536 | 200 | 0 | 8 | +| hmd.medium | 16384 | 50 | 0 | 2 | +| hmd.large | 32768 | 100 | 0 | 4 | + +``` + +You would use an HMD flavor mainly for the master node(s) in the cluster. + +In WAW3-2 cloud, you would use flavors starting with HMAD instead of HMD. + +Example parameters to create a new cluster with localstorage and NVMe[](#example-parameters-to-create-a-new-cluster-with-localstorage-and-nvme "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +For general discussion of parameters, see Prerequisite No. 4. What follows is a simplified example, geared to creation of cluster using *localstorage*. + +We shall use WAW3-1 with HMD flavors in the example but you can, of course, supply HMAD flavors for WAW3-2 and so on. + +The only deviation from the usual procedure is that it is mandatory to add label **etcd\_volume\_size=0** in the **Advanced** window. Without it, *localstorage* template won’t work. + +Start creating a cluster with the usual chain of commands **Container Infra** -> **Clusters** -> **+ Create New Cluster**. + +In the screenshot below, we selected *k8s-stable-localstorage-1.23.5* as our local storage template of choice, in mandatory field **Cluster Template**. + +For field **Keypair** use SSH key that you already have and if you do not have it yet, use Prerequisite No. 2 to obtain it. + +![create_cluster_details.png](../_images/create_cluster_details.png) + +Let master nodes use one of the HMD flavors: + +![create_cluster_size.png](../_images/create_cluster_size.png) + +Proceed to enter the usual parameters into the Network and Management windows. + +The last window, **Advanced**, is the place to add label **etcd\_volume\_size=0**. + +![create_cluster_advanced.png](../_images/create_cluster_advanced.png) + +The result will be a formed cluster NVMe: + +![create_cluster_working.png](../_images/create_cluster_working.png) \ No newline at end of file diff --git a/docs/kubernetes/Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..aff59ad --- /dev/null +++ b/docs/kubernetes/Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html.md @@ -0,0 +1,300 @@ +Deploy Keycloak on Kubernetes with a sample app on CloudFerro Cloud[](#deploy-keycloak-on-kubernetes-with-a-sample-app-on-brand-name "Permalink to this headline") +=================================================================================================================================================================== + +[Keycloak](https://www.keycloak.org/) is a large Open-Source Identity Management suite capable of handling a wide range of identity-related use cases. + +Using Keycloak, it is straightforward to deploy a robust authentication/authorization solution for your applications. After the initial deployment, you can easily configure it to meet new identity-related requirements, e.g. multi-factor authentication, federation to social-providers, custom password policies, and many others. + +What We Are Going To Do[](#what-we-are-going-to-do "Permalink to this headline") +--------------------------------------------------------------------------------- + +> * Deploy Keycloak on a Kubernetes cluster +> * Configure Keycloak: create a realm, client and a user +> * Deploy a sample Python web application using Keycloak for authentication + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **A running Kubernetes cluster and kubectl activated** + +A Kubernetes cluster, to create one refer to: [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). To activate **kubectl**, see [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 3 **Basic knowledge of Python and pip package management** + +Basic knowledge of Python and pip package management is expected. Python 3 and pip should be already installed and available on your local machine. + +No. 4 **Familiarity with OpenID Connect (OIDC) terminology** + +Certain familiarity with OpenID Connect (OIDC) terminology is required. Some key terms will be briefly explained in this article. + +Step 1 Deploy Keycloak on Kubernetes[](#step-1-deploy-keycloak-on-kubernetes "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Let’s first create a dedicated Kubernetes namespace for Keycloak. This is optional, but good practice: + +``` +kubectl create namespace keycloak + +``` + +Then deploy Keycloak into this namespace: + +``` +kubectl create -f https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak.yaml -n keycloak + +``` + +Keycloak, by default, gets exposed as a Kubernetes service of a type LoadBalancer, on port 8080. You need to find out the service public IP with the following command (note it might take a couple minutes to populate): + +``` +kubectl get services -n keycloak +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +keycloak LoadBalancer 10.254.8.94 64.225.128.216 8080:31228/TCP 23h + +``` + +Note + +In our case, the external IP address is **64.225.128.216** so that is what we are going to use in this article. Be sure to replace it with the IP address of your own. + +So, enter **http://64.225.128.216:8080/** to browser to access Keycloak: + +![image2023-4-4_13-37-48.png](../_images/image2023-4-4_13-37-48.png) + +Next, click on **Administration Console** and you will get redirected to the login screen, where you can sign-in as an admin (login/password *admin/admin* ) + +![image2023-4-4_13-28-40.png](../_images/image2023-4-4_13-28-40.png) + +This is full screen view of the Keycloak window: + +![keycloack_full_screen.png](../_images/keycloack_full_screen.png) + +Step 2 Create Keycloak realm[](#step-2-create-keycloak-realm "Permalink to this headline") +------------------------------------------------------------------------------------------- + +In Keycloak terminology, a *realm* is a dedicated space for managing an isolated subset of users, roles and other related entities. Keycloak has initially a master realm used for administration of Keycloak itself. + +Our next step is to create our own realm and start operating within its context. To create it, click first on **master** field in the upper left corner, then click on **Create Realm**. + +![image2023-6-14_15-24-46.png](../_images/image2023-6-14_15-24-46.png) + +We will just enter the realm name *myrealm*, leaving the rest unchanged: + +![image2023-6-14_15-26-51.png](../_images/image2023-6-14_15-26-51.png) + +When the realm is created (and selected), we operate within this realm: + +![image2023-6-14_15-29-22.png](../_images/image2023-6-14_15-29-22.png) + +In the left upper corner, instead of **master** now is the name of the selected realm, **myrealm**. + +Step 3 Create and configure Keycloak client[](#step-3-create-and-configure-keycloak-client "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +Clients are entities in Keycloak that can request Keycloak to authenticate users. In practical terms, they can be thought of as representation of individual applications that want to utilize Keycloak-managed authentication/authorization. + +Within the *myrealm* realm, we will now create a client *myapp* that will represent the web application which we will create in one of the further steps. To create one such client, click on the Clients panel on the left menu, and then on **Create Client** button. + +You will enter a wizard consisting of 3 steps. In the first step we just enter the ID of the client (which, in our case, is *myapp*), leaving other settings unchanged: + +![image2023-6-14_15-40-56.png](../_images/image2023-6-14_15-40-56.png) + +The next screen involves selecting some crucial settings relating to the authentication/authorization requirements of your specific application. + +![create_client_with_authentication.png](../_images/create_client_with_authentication.png) + +The options you choose will depend on your particular scenario: + +Scenario 1 Traditional server applications +: For the purpose of this article and our demo app, we use a traditional client server application. We then need to turn on the “Client Authentication” toggle. + +Scenario 2 SPA +: For single page applications, you can stay with the default where “Client Authentication” toggle is off. + +For our demo app, we will require authentication via secret, so be sure to activate option **Client Authentication**. Once it is turned on, we will be able to the obtain the value of *secret* later on, in Step 5. + +The last step of the Wizard involves setting some key coordinates of our client application. The ones we modify involve: + +![image2023-6-14_16-8-44.png](../_images/image2023-6-14_16-8-44.png) + +root URL +: In our case, we want to deploy the app locally so we set up the root as . You will need to change this if your app will be exposed as a public service. + +Valid redirect URIs +: This setting represents a route in our app, to which a user will be redirected after a successful login from Keycloak. In our case, we leave this setting very permissive with a “\*”, allowing redirect to any path in our application. For production, you should make this more explicit, using a dedicated route, say, */callback*, for this purpose. + +Web origins +: This setting specifies hosts that can send requests to Keycloak. Requests from other hosts will not pass the cross-origin check and will be rejected. Also here we are very permissive by setting a “\*”. Similarly as above, strongly consider changing this setting for production, and limit to trusted sources only. + +After hitting **Save**, your client is created. You can then modify the previously selected settings of the created client, and add new, more specific ones. There are vast possibilities for further customization depending on your app specifics, this is however beyond the scope of this article. + +Step 4 Create a User in Keycloak[](#step-4-create-a-user-in-keycloak "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +After creating the Client, we will proceed to creating our first User in Keycloak. In order to do so, click on the Users tab on the left and then **Create New User**: + +We will again be very selective and only choose *test* as the username, leaving other options intact: + +![image2023-6-14_16-41-7.png](../_images/image2023-6-14_16-41-7.png) + +Next, we will set up password credentials for the newly created user. Select **Credentials** tab and then **Set password**, type in the password with confirmation in the form and hit Save: + +![image2023-6-15_8-43-7.png](../_images/image2023-6-15_8-43-7.png) + +Step 5 Retrieve client secret from Keycloak[](#step-5-retrieve-client-secret-from-keycloak "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +Once we have the Keycloak set up, we will need to extract the client *secret*, so that Keycloak establishes trust with our application. + +The *client\_secret* can be extracted by going into *myrealm* realm, selecting *myapp* as the client and then taking the client secret with the following chain of commands: + +> **Clients** –> **Client detail** –> **Credentials** + +Once in tab **Credentials**, the secret will become accessible through field **Client secret**: + +![image2023-6-26_11-27-0.png](../_images/image2023-6-26_11-27-0.png) + +For privacy reasons, in the screeshot above, it is painted yellow. In your case, take note of its value, as in the next step you will need to paste it into the application code. + +Step 6 Create a Flask web app utilizing Keycloak authentication[](#step-6-create-a-flask-web-app-utilizing-keycloak-authentication "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------- + +To build the app, we will use Flask, which is a lightweight Python-based web framework. Keycloak supports wide range of other technologies as well. We will use Flask-OIDC library, which expands Flask with capability to run OpenID Connect authentication/authorization scenarios. + +As a prerequisite, you need to install the following pip packages to cover the dependency chain. Best run the commands from an already preinstalled Python virtual environment: + +``` +pip install Werkzeug==2.3.8 +pip install Flask==2.0.1 +pip install wheel==0.40.0 +pip install flask-oidc==1.4.0 +pip install itsdangerous==2.0.1 + +``` + +Then you will need to create 2 files: *app.py* and *keycloak.json*. You will need the following changes in these files: + +Replace the IP address +: In *keycloak.json*, replace *64.225.128.216* with your own external IP from **Step 1**. + +Replace client\_secret +: Again in *keycloak.json*, replace value of variable client\_secret with the secret from **Step 5**. + +Replace client\_secret +: In file *app.py*, replace value of *SECRET\_KEY* with the same secret from **Step 5**. + +Create a new file called *app.py* and paste in the following contents: + +``` +from flask import Flask, g +from flask_oidc import OpenIDConnect +import json + +app = Flask(__name__) + +app.config.update( + SECRET_KEY='XXXXXX', + OIDC_CLIENT_SECRETS='keycloak.json', + OIDC_INTROSPECTION_AUTH_METHOD='client_secret_post', + OIDC_TOKEN_TYPE_HINT='access_token', + OIDC_SCOPES=['openid','email','profile'], + OIDC_OPENID_REALM='myrealm' + ) + +oidc = OpenIDConnect(app) + +@app.route('/') +def index(): + if oidc.user_loggedin: + info = oidc.user_getinfo(["preferred_username", "email", "sub"]) + return 'Welcome %s' % info.get("preferred_username") + else: + return '

Not logged in

' + +@app.route('/login') +@oidc.require_login +def login(): + token = oidc.get_access_token() + info = oidc.user_getinfo(["preferred_username", "email", "sub"]) + username = info.get("preferred_username") + return "Token: " + token + "

Username: " + username + +@app.route('/logout') +def logout(): + oidc.logout() + return '

Hi, you have been logged out! Return

' + +``` + +The application code bootstraps the Flask application and provides the configurations necessary for *flask\_oidc*. We need to configure the + +> * name of our realm, the +> * client *secret\_key* and the +> * additional settings that reflect our specific sample flow. + +Also, this configuration points to another configuration file, *keycloak.json*, which reflects further settings of our Keycloak realm. Specifically, in it you will find the client ID and the secret, as well as the endpoints where Keycloak makes available further information about the realm settings. + +Create the required file *keycloak.json*, in the same working folder as the *app.py* file: + +``` +{ +"web": { + "client_id": "myapp", + "client_secret": "XXXXXX", + "auth_uri": "http://64.225.128.216:8080/realms/myrealm/protocol/openid-connect/auth", + "token_uri": "http://64.225.128.216:8080/realms/myrealm/protocol/openid-connect/token", + "issuer": "http://64.225.128.216:8080/realms/myrealm", + "userinfo_uri": "http://64.225.128.216:8080/realms/myrealm/protocol/openid-connect/userinfo", + "token_introspection_uri": "http://64.225.128.216:8080/realms/myrealm/protocol/openid-connect/token/introspect", + "redirect_uris": [ + "http://localhost:5000/*" + ] + } +} + +``` + +Note that *app.py* creates 3 routes: + +/ +: In this route, a page is served that provides the name of a logged in user. Alternatively, if the user is not logged in yet, it prompts to do so. + +`/login` +: This route redirects the user to the Keycloak login page and upon successful authentication provides user name and token + +`/logout` +: Entering this route logs the user out. + +Step 7 Test the application[](#step-7-test-the-application "Permalink to this headline") +----------------------------------------------------------------------------------------- + +To test the application, execute the following command from the working directory in which file *app.py* is placed: + +``` +flask run + +``` + +This is the result, in a CLI window: + +![flask_run.png](../_images/flask_run.png) + +We now know that the *localhost* is running flask server on port 5000. Enter *localhost:5000* into the browser address bar and it will display the site served on the base route: */* . We have not logged in our user yet, hence the respective message: + +![image2023-6-26_11-54-29.png](../_images/image2023-6-26_11-54-29.png) + +The next step is to enter the */login* route. Enter *localhost:5000/login* into the browser address bar. Doing so, redirects to Keycloak prompting to log in to *myapp*: + +![image2023-6-26_12-0-35.png](../_images/image2023-6-26_12-0-35.png) + +To authenticate, enter the username of the user we created in step 3 (username: *test*), and the password you used to create this user. With default settings, you might be asked to change the password after first login, then just proceed accordingly. After logging in, our username and token get displayed (for security reasons, parts of the token are painted in yellow): + +![image2023-6-26_12-36-24.png](../_images/image2023-6-26_12-36-24.png) + +The last route to test is */logout* . When entering *localhost:5000/logout* to the browser, we can see the screen below. Entering this route calls the *flask-oidc* method that logs the user out, also clearing the session cookie under the hood. + +![image2023-6-26_12-42-24.png](../_images/image2023-6-26_12-42-24.png) \ No newline at end of file diff --git a/docs/kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html.md b/docs/kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html.md new file mode 100644 index 0000000..87d5ba7 --- /dev/null +++ b/docs/kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html.md @@ -0,0 +1,304 @@ +Deploying HTTPS Services on Magnum Kubernetes in CloudFerro Cloud Cloud[](#deploying-https-services-on-magnum-kubernetes-in-brand-name-cloud-name-cloud "Permalink to this headline") +====================================================================================================================================================================================== + +Kubernetes makes it very quick to deploy and publicly expose an application, for example using the LoadBalancer service type. Sample deployments, which demonstrate such capability, are usually served with HTTP. Deploying a production-ready service, secured with HTTPS, can also be done smoothly, by using additional tools. + +In this article, we show how to deploy a sample HTTPS-protected service on CloudFerro Cloud cloud. + +What We are Going to Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install Cert Manager’s Custom Resource Definitions +> * Install Cert Manager Helm chart +> * Create a Deployment and a Service +> * Create and Deploy an Issuer +> * Associate the domain with NGINX Ingress +> * Create and Deploy an Ingress Resource + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Kubernetes cluster deployed on** **cloud, with NGINX Ingress enabled** + +See this article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Familiarity with kubectl** + +For further instructions refer to [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **Familiarity with Kubernetes Ingress feature** + +It is explained in article [Using Kubernetes Ingress on CloudFerro Cloud OpenStack Magnum](Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 5 **Familiarity with deploying Helm charts** + +See this article: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 6 **Must have domain purchased from a registrar** + +You also must own a domain purchased from any registrar (domain reseller). Obtaining a domain from registrars is not covered in this article. + +No. 7 **Use DNS command Horizon to connect to the domain name** + +This is optional. Here is the article with detailed information: + +[DNS as a Service on CloudFerro Cloud Hosting](../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html) + +Step 1 Install Cert Manager’s Custom Resource Definitions (CRDs)[](#step-1-install-cert-manager-s-custom-resource-definitions-crds "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------- + +We assume you have your + +> * Magnum cluster up and running and +> * **kubectl** pointing to your cluster *config* file. + +As a pre-check, you can list the nodes on your cluster: + +``` +# export KUBECONFIG= +kubectl get nodes + +``` + +CertManager Helm chart utilizes a few of Custom Resource Definitions (CRDs) which we will need to deploy on our cluster. Aside from multiple default Kubernetes-available resources (e.g., Pods, Deployments or Services), CRDs enable to deploy custom resources defined by third party developers to satisfy further customized use cases. Let’s add CRDs to our cluster with the following command: + +``` +kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.2/cert-manager.crds.yaml + +``` + +The list of the resources will be displayed after running the command. If we want to later refer to them we can also use the following **kubectl** command: + +``` +kubectl get crd -l app.kubernetes.io/name=cert-manager +... +NAME CREATED AT +certificaterequests.cert-manager.io 2022-12-18T11:15:08Z +certificates.cert-manager.io 2022-12-18T11:15:08Z +challenges.acme.cert-manager.io 2022-12-18T11:15:08Z +clusterissuers.cert-manager.io 2022-12-18T11:15:08Z +issuers.cert-manager.io 2022-12-18T11:15:08Z +orders.acme.cert-manager.io 2022-12-18T11:15:08Z + +``` + +Warning + +Magnum introduces a few pod security policies (PSP) which provide some extra safety precautions for the cluster, but will cause conflict with the CertManager Helm chart. PodSecurityPolicy is deprecated until Kubernetes v. 1.25, but still supported in version of Kubernetes 1.21 to 1.23 available on CloudFerro Cloud cloud. The commands below may produce warnings about deprecation but the installation should continue nevertheless. + +Step 2 Install CertManager Helm chart[](#step-2-install-certmanager-helm-chart "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +We assume you have installed Helm according to the article mentioned in Prerequisite No. 5. The result of that article will be file *my-values.yaml* and in order to ensure correct deployment of CertManager Helm chart, we will need to + +> * override it and +> * insert the appropriate content into it: + +**my-values.yaml** + +``` +global: + podSecurityPolicy: + enabled: true + useAppArmor: false + +``` + +The following code will both install the CertManager Helm chart into a namespace *cert-manager* and use *my-values.yaml* at the same time: + +``` +helm repo add jetstack https://charts.jetstack.io +helm repo update +helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.2 --values my-values.yaml + +``` + +This is the result: + +``` +helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.2 --values my-values.yaml +W0208 10:16:08.364635 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:08.461599 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:08.502602 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:11.489377 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:11.489925 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:11.524300 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:13.949045 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:16:15.038803 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +W0208 10:17:36.084859 212 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ +NAME: cert-manager +LAST DEPLOYED: Wed Feb 8 10:16:07 2023 +NAMESPACE: cert-manager +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +cert-manager v1.9.2 has been deployed successfully! + +In order to begin issuing certificates, you will need to set up a ClusterIssuer +or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer). + +``` + +We see that *cert-manager* is deployed successfully but also get a hint that *ClusterIssuer* or an *Issuer* resource has to be installed as well. Our next step is to install a sample service into the cluster and then continue with creation and deployment of an *Issuer*. + +Step 3 Create a Deployment and a Service[](#step-3-create-a-deployment-and-a-service "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +Let’s deploy NGINX service as a standard example of a Kubernetes app. First we create a standard Kubernetes deployment and then a service of type *NodePort*. Write the following contents to file *my-nginx.yaml* : + +**my-nginx.yaml** + +``` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-nginx-deployment +spec: + selector: + matchLabels: + run: my-nginx + replicas: 1 + template: + metadata: + labels: + run: my-nginx + spec: + containers: + - name: my-nginx + image: nginx + ports: + - containerPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: my-nginx-service + labels: + run: my-nginx +spec: + type: NodePort + ports: + - port: 80 + protocol: TCP + selector: + run: my-nginx + +``` + +Deploy with the following command: + +``` +kubectl apply -f my-nginx.yaml + +``` + +Step 4 Create and Deploy an Issuer[](#step-4-create-and-deploy-an-issuer "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +Now install an *Issuer*. It is a custom Kubernetes resource and represents Certificate Authority (CA), which ensures that our HTTPS are signed and therefore trusted by the browsers. CertManager supports different issuers, in our example we will use Let’s Encrypt, that uses ACME protocol. + +Create a new file called *my-nginx-issuer.yaml* and paste the following content into it. Change the email address *XXXXXXXXX@YYYYYYYYY.com* to your own and real email address. + +**my-nginx-issuer.yaml** + +``` +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: my-nginx-issuer +spec: + acme: + email: [email protected] + server: https://acme-v02.api.letsencrypt.org/directory # production + privateKeySecretRef: + name: letsencrypt-secret # different secret name than for ingress + solvers: + # HTTP-01 challenge provider, creates additional ingress, refer to CertManager documentation for detailed explanation + - http01: + ingress: + class: nginx + +``` + +Then deploy on the cluster: + +``` +kubectl apply -f my-nginx-issuer.yaml + +``` + +As a result, the *Issuer* gets deployed, and a *Secret* called *letsencrypt-secret* with a private key is deployed as well. + +Step 5 Associate the Domain with NGINX Ingress[](#step-5-associate-the-domain-with-nginx-ingress "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +To see the site in browser, your HTTPS certificate will need to be associated with a specific domain. To follow along, you should have a real domain already registered at a domain registrar. + +When you deployed your cluster with NGINX ingress, behind the scenes a LoadBalancer was deployed, with a public IP address exposed. You can obtain this address by looking it up in the Horizon web interface. If your list or floating IPs is longer, it can be easily recognized by name: + +![floating_ips.png](../_images/floating_ips.png) + +Now, at your domain registrar you need to associate the A record of the domain with the floating IP address of the ingress, where your application will be exposed. The way to achieve this will vary by the specific registrar, so we will not provide detailed instructions here. + +You can also use the DNS command in Horizon to connect the domain name you have with the cluster. See Prerequisite No. 7 for additional details. + +Step 6 Create and Deploy an Ingress Resource[](#step-6-create-and-deploy-an-ingress-resource "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +The final step is to deploy the *Ingress* resource. This will perform the necessary steps to initiate the certificate signing request with the CA and ultimately provide the HTTPS certificate for your service. In order to proceed, place the contents below into file *my-nginx-ingress.yaml*. Replace **mysampledomain.eu** with your domain. + +**my-nginx-ingress.yaml** + +``` +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: my-nginx-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / + # below annotation is for using cert manager's "ingress shim", refer to CertManager documentation + cert-manager.io/issuer: my-nginx-issuer # use the name of the issuer here +spec: + ingressClassName: nginx + tls: + - hosts: + - mysampledomain.eu #change to own domain + secretName: my-nginx-secret + rules: + - host: mysampledomain.eu #change to own domain + http: + paths: + - path: /* + pathType: Prefix + backend: + service: + name: my-nginx-service + port: + number: 80 + +``` + +Then deploy with: + +``` +kubectl apply -f my-nginx-ingress.yaml + +``` + +If all works well, the effort is complete and after a couple of minutes we should see the lock sign in front of our IP address. The service is now HTTPS-secured, and you can verify the details of the certificate by clicking on the lock icon. + +![image2022-12-9_10-55-8.png](../_images/image2022-12-9_10-55-8.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +The article [Using Kubernetes Ingress on CloudFerro Cloud OpenStack Magnum](Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html) shows how to create an HTTP based service or a site. + +If you need additional information on Helm charts: [Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html). \ No newline at end of file diff --git a/docs/kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html.md b/docs/kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html.md new file mode 100644 index 0000000..6689eb5 --- /dev/null +++ b/docs/kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html.md @@ -0,0 +1,241 @@ +Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud[](#deploying-helm-charts-on-magnum-kubernetes-clusters-on-brand-name-cloud-name-cloud "Permalink to this headline") +================================================================================================================================================================================================== + +Kubernetes is a robust and battle-tested environment for running apps and services, yet it could be time consuming to manually provision all resources required to run a production-ready deployment. This article introduces [Helm](https://helm.sh/) as a package manager for Kubernetes. With it, you will be able to quickly deploy complex Kubernetes applications, consisting of code, databases, user interfaces and more. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Background - How Helm works +> * Install Helm +> * Add a Helm repository +> * Helm chart repositories +> * Deploy Helm chart on a cluster +> * Customize chart deployment + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Basic understanding of Kubernetes** + +We assume you have basic understanding of Kubernetes, its notions and ways of working. Explaining them is out of scope of this article. + +No. 3 **A cluster created on** **cloud** + +For trying out Helm installation and deployment in an actual environment, create a cluster on cloud using OpenStack Magnum [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 4 **Active connection to the cloud** + +For Kubernetes, that means a **kubectl** command line tool installed and **kubeconfig** pointing to a cluster. Instructions are provided in this article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 5 **Access to Ubuntu to run code on** + +Code samples in this article assume you are running Ubuntu 20.04 LTS or similar Linux system. You can run them on + +> * Windows with Linux subsystem, +> * genuine desktop Ubuntu operating system or you can also +> * create a virtual machine in the CloudFerro Cloud cloud and run the examples from there. These articles will provide technical know-how if you need it: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html) + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +Background - How Helm works[](#background-how-helm-works "Permalink to this headline") +--------------------------------------------------------------------------------------- + +A usual sequence of deploying an application on Kubernetes entails: + +> * having one or more containerized application images available in an image registry +> * deploying one or more Kubernetes resources, in the form of manifest YAML files, onto a Kubernetes cluster + +The Kubernetes resources, directly or indirectly, point to the container images. They can also contain additional information required by these images to run. In a very minimal setup, we would have e.g., an NGINX container image deployed with a **deployment** Kubernetes resource, and exposed on a network via a **service** resource. A production-grade Kubernetes deployment of a larger application usually requires a set of several, or more, Kubernetes resources to be deployed on the cluster. + +For each standard deployment of an application on Kubernetes (e.g. a database, a CMS system, a monitoring application), the boilerplate YAML manifests would mostly be the same and only vary based on the specific values assigned (e.g. ports, endpoints, image registry, version, etc.). + +**Helm**, therefore, automates the process of provisioning a Kubernetes deployment. The person in charge of the deployment does not have to write each resource from the scratch or consider the links between the resources. Instead, they download a **Helm chart**, which provides predefined resource templates. The values for the templates are read from a central configuration file called *values.yaml*. + +Helm charts are designed to cover a broad set of use cases required for deploying an application. The application can be then simply launched on a cluster with a few commands within seconds. Some specific customizations for an individual deployment can be then easily adjusted by overriding the default *values.yaml* file. + +Install Helm[](#install-helm "Permalink to this headline") +----------------------------------------------------------- + +You can install Helm on your own development machine. To install, download the installer file from the Helm release page, change file permission, and run the installation: + +``` +curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 +chmod 700 get_helm.sh + ./get_helm.sh + +``` + +You can verify the installation by running: + +``` +$ helm version + +``` + +For other operating systems, use the [link to download Helm installation files](https://phoenixnap.com/kb/install-helm) and proceed analogously. + +Add a Helm repository[](#add-a-helm-repository "Permalink to this headline") +----------------------------------------------------------------------------- + +Helm charts are distributed using repositories. For example, a single repository can host several Helm charts from a certain provider. For the purpose of this article, we will add the Bitnami repository that contains their versions of multiple useful Helm charts e.g. Redis, Grafana, Elasticsearch, or others. You can run it using the following command: + +``` +helm repo add bitnami https://charts.bitnami.com/bitnami + +``` + +Then verify the available charts in this repository by running: + +``` +helm search repo + +``` + +The following image shows just a start of all the available apps from *bitnami* repository to install with Helm: + +![search_repo.png](../_images/search_repo.png) + +Helm chart repositories[](#helm-chart-repositories "Permalink to this headline") +--------------------------------------------------------------------------------- + +In the above example, we knew where to find a repository with Helm charts. There are other repositories and they are usually hosted on GitHub or ArtifactHub. Let us have a look at the [apache page in ArtifactHUB](https://artifacthub.io/packages/helm/bitnami/apache): + +![apache_bitnami.png](../_images/apache_bitnami.png) + +Click on the DEFAULT VALUES option (yellow highlight) and see contents of the default *values.yaml* file. + +![parameters.png](../_images/parameters.png) + +In this file (or in additional tabular information on the chart page), you can check which parameters are enabled for customization, and which are their default values. + +Check whether kubectl has access to the cluster[](#check-whether-kubectl-has-access-to-the-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +To proceed further, verify that you have your KUBECONFIG environment variable exported and pointing to a running cluster’s *kubeconfig* file (see Prerequisite No. 4). If there is need, export this environment variable: + +``` +export KUBECONFIG = + +``` + +If your kubectl is properly installed, you should be then able to list the nodes on your cluster: + +``` +kubectl get nodes + +``` + +That will serve as the confirmation that you have access to the cluster. + +Deploy a Helm chart on a cluster[](#deploy-a-helm-chart-on-a-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Now that we know where to find repositories with hundreds of charts to choose from, let’s deploy one of them to our cluster. + +We will install an Apache web server Helm chart. In order to install it with a default configuration, we need to run a single command: + +``` +helm install my-apache bitnami/apache + +``` + +Note that *my-apache* refers to the concrete release, that is, the concrete deployment running on our cluster. We can adjust this name to our liking. Upon running the above command, the chart gets deployed and some insight about our release is provided: + +``` +NAME: my-apache +LAST DEPLOYED: Tue Jan 31 10:48:07 2023 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +CHART NAME: apache +CHART VERSION: 9.2.11 +APP VERSION: 2.4.55 +.... + +``` + +As a result, several Kubernetes resources get deployed on the cluster. One of them is the Kubernetes service, which by default gets deployed as a LoadBalancer type. This way your Apache deployment gets immediately publicly exposed with a floating IP available in the cell on the default port 80: + +``` +$ kubectl get services +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +... +my-apache LoadBalancer 10.254.147.21 64.225.131.111 80:32654/TCP,443:32725/TCP 5m + +``` + +Note that the floating IP generation can take a couple of minutes to appear. After this time, once you enter the floating IP into the browser you shall see the service available from the Internet: + +![apache_ip.png](../_images/apache_ip.png) + +Customizing the chart deployment[](#customizing-the-chart-deployment "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +We just saw how quick it was to deploy a Helm chart with the default settings. Usually, before running the chart in production, you will need to adjust a few settings to meet your requirements. + +To customize the deployment, a quick and dirty approach would be to provide flags on the Helm command line to adjust specific parameters. The problem is that each command line option will have 10-20 available flags, so this approach may not be the best in the long run. + +A more universal approach, however, is to customize the *values.yaml* file. There are two main ways of doing it: + +**Copy the entire values.yaml file** +: Here you only adjust the value of a specific parameter. + +**Create new values.yaml file from scratch** +: It would contain only the adjusted parameters, with their overridden values. + +In both scenarios, all defaults, apart from the overridden ones, will be preserved. + +**As an example of customizing the chart**, let us expose Apache web server on port **8080** instead of the default **80**. We will use the second approach and provide a minimal *my-values.yaml* file for the overrides. The contents of this file will be the following: + +**my-values.yaml** + +``` +service: + ports: + http: 8080 + +``` + +With these customizations, make sure to follow the indentation and follow the YAML structure indicating also the respective parent blocks in the tree. + +A separate adjustment that we will make is to create a dedicated namespace *apache* for our Helm release and instruct Helm to use this namespace. Such an adjustment is quite usual, in order to separate the artifacts related to a specific release/application. + +Apply the mentioned customizations to the *my-custom-apache* release, using the following command: + +``` +helm install my-custom-apache bitnami/apache --values my-values.yaml --namespace custom-apache --create-namespace + +``` + +Similarly, as in the earlier example, the service gets exposed. This time, to access the service’s floating IP, refer to the newly created *custom-apache* namespace: + +``` +kubectl get services -n custom-apache +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +my-custom-apache LoadBalancer 10.254.230.171 64.225.135.161 8080:31150/TCP,443:30139/TCP 3m51s + +``` + +We can see that the application is now exposed to a new port 8080, which can be verified in the browser as well: + +![trag_8080.png](../_images/trag_8080.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Deploy other useful services using Helm charts: [Argo Workflows](https://artifacthub.io/packages/helm/bitnami/argo-workflows), [JupyterHub](https://artifacthub.io/packages/helm/jupyterhub/jupyterhub), [Vault](https://artifacthub.io/packages/helm/hashicorp/vault) amongst many others that are available. + +Remember that a chart deployed with Helm is, in the end, just a set of Kubernetes resources. Usually, there is a hefty amount of configurable settings in the available Open Source charts. Just as well, you can edit other parameters on an already deployed cluster and you can even modify the templates to your specific use case. + +The following article will show how to use JetStack repo to install CertManager, with which you can deploy HTTPS services on Kubernetes cloud: + +[Deploying HTTPS Services on Magnum Kubernetes in CloudFerro Cloud Cloud](Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html) \ No newline at end of file diff --git a/docs/kubernetes/Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html.md b/docs/kubernetes/Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html.md new file mode 100644 index 0000000..be7f945 --- /dev/null +++ b/docs/kubernetes/Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html.md @@ -0,0 +1,388 @@ +Deploying vGPU workloads on CloudFerro Cloud Kubernetes[](#deploying-vgpu-workloads-on-brand-name-kubernetes "Permalink to this headline") +=========================================================================================================================================== + +Utilizing GPU (Graphical Processing Units) presents a highly efficient alternative for fast, highly parallel processing of demanding computational tasks such as image processing, machine learning and many others. + +In cloud environment, virtual GPU units (vGPU) are available with certain Virtual Machine flavors. This guide provides instructions how to attach such VMs with GPU as Kubernetes cluster nodes and utilize vGPU from Kubernetes pods. + +We will present three alternative ways for adding vGPU capability to your Kubernetes cluster, based on your required scenario. For each, you should be able to verify the vGPU installation and test it by running vGPU workload. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * **Scenario No. 1** - Add vGPU nodes as a nodegroup on a non-GPU Kubernetes clusters created **after** June 21st 2023 +> * **Scenario No. 2** - Add vGPU nodes as nodegroups on non-GPU Kubernetes clusters created **before** June 21st 2023 +> * **Scenario No. 3** - Create a new GPU-first Kubernetes cluster with vGPU-enabled default nodegroup +> * Verify the vGPU installation +> * Test vGPU workload +> * Add non-GPU nodegroup to a GPU-first cluster + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Knowledge of RC files and CLI commands for Magnum** + +You should be familiar with utilizing OpenStack CLI and Magnum CLI. Your RC file should be sourced and pointing to your project in OpenStack. See article + +[How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html). + +Note + +If you are using CLI when creating vGPU nodegroups and are being authenticated with application credentials, please ensure the credential is created with setting + +**unrestricted: true** + +No. 3 **Cluster and kubectl should be operational** + +To connect to the cluster via **kubectl** tool, see this article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 4 **Familiarity with the notion of nodegroups** + +[Creating Additional Nodegroups in Kubernetes Cluster on CloudFerro Cloud OpenStack Magnum](Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html). + +vGPU flavors per cloud[](#vgpu-flavors-per-cloud "Permalink to this headline") +------------------------------------------------------------------------------- + +Below is the list of GPU flavors in each cloud, applicable for using with Magnum Kubernetes service. + +WAW3-1 +: WAW3-1 supports both four GPU flavors and the Kubernetes, through OpenStack Magnum. + + > | | | | | + > | --- | --- | --- | --- | + > | Name | RAM (MB) | Disk (GB) | VCPUs | + > | **vm.a6000.1** | 14336 | 40 | 2 | + > | **vm.a6000.2** | 28672 | 80 | 4 | + > | **vm.a6000.3** | 57344 | 160 | 8 | + > | **vm.a6000.4** | 114688 | 320 | 16 | + +WAW3-2 +: These are the vGPU flavors for WAW3-2 and Kubernetes, through OpenStack Magnum: + + > | | | | | | + > | --- | --- | --- | --- | --- | + > | Name | VCPUS | RAM | Total Disk | Public | + > | **vm.l40s.1** | 4 | 14.9 GB | 40 GB | Yes | + > | **vm.l40s.8** | 32 | 119.22 GB | 320 GB | Yes | + > | **gpu.l40sx2** | 64 | 238.44 GB | 512 GB | Yes | + > | **gpu.l40sx8** | 254 | 953.75 GB | 1000 GB | Yes | + +FRA1-2 +: FRA1-2 Supports L40S and the Kubernetes, through OpenStack Magnum. + + > | | | | | | + > | --- | --- | --- | --- | --- | + > | Name | VCPUS | RAM | Total Disk | Public | + > | **vm.l40s.2** | 8 | 29.8 GB | 80 GB | Yes | + > | **vm.l40s.8** | 32 | 119.22 GB | 320 GB | Yes | + +Hardware comparison between RTX A6000 and NVIDIA L40S[](#hardware-comparison-between-rtx-a6000-and-nvidia-l40s "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------- + +The NVIDIA L40S is designed for 24x7 enterprise data center operations and optimized to deploy at scale. As compared to A6000, NVIDIA L40S is better for + +> * parallel processing tasks +> * AI workloads, +> * real-time ray tracing applications and is +> * faster for in memory-intensive tasks. + +Table 1 Comparison of NVIDIA RTX A6000 vs NVIDIA L40S[](#id1 "Permalink to this table") + +| Specification | NVIDIA RTX A60001 | NVIDIA L40S1 | +| --- | --- | --- | +| **Architecture** | Ampere | Ada Lovelace | +| **Release Date** | 2020 | 2023 | +| **CUDA Cores** | 10,752 | 18,176 | +| **Memory** | 48 GB GDDR6 (768 GB/s bandwidth) | 48 GB GDDR6 (864 GB/s bandwidth) | +| **Boost Clock Speed** | Up to 1,800 MHz | Up to 2,520 MHz | +| **Tensor Cores** | 336 (3rd generation) | 568 (4th generation) | +| **Performance** | Strong performance for diverse workloads | Superior AI and machine learning performance | +| **Use Cases** | 3D rendering, video editing, AI development | Data center, large-scale AI, enterprise applications | + +Scenario 1 - Add vGPU nodes as a nodegroup on a non-GPU Kubernetes clusters created after June 21st 2023[](#scenario-1-add-vgpu-nodes-as-a-nodegroup-on-a-non-gpu-kubernetes-clusters-created-after-june-21st-2023 "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +In order to create a new nodegroup, called **gpu**, with one node vGPU flavor, say, **vm.a6000.2**, we can use the following Magnum CLI command: + +``` +openstack coe nodegroup create $CLUSTER_ID gpu \ +--labels "worker_type=gpu" \ +--merge-labels \ +--role worker \ +--flavor vm.a6000.2 \ +--node-count 1 + +``` + +Adjust the *node-count* and *flavor* to your preference, adjust the $CLUSTER\_ID to the one of your clusters (this can be taken from Clusters view in Horizon UI), and ensure the role is set as *worker*. + +The key setting is adding a label **worker\_type=gpu**: + +Your request will be accepted: + +![request_for_nodegroup.png](../_images/request_for_nodegroup.png) + +Now list the available nodegroups: + +``` +openstack coe nodegroup list $CLUSTER_ID_RECENT \ +--max-width 120 + +``` + +We get: + +![result_of_creating_nodegroup.png](../_images/result_of_creating_nodegroup.png) + +The result is that a new nodegroup called **gpu** is created in the cluster and that it is using the GPU flavor. + +Scenario 2 - Add vGPU nodes as nodegroups on non-GPU Kubernetes clusters created before June 21st 2023[](#scenario-2-add-vgpu-nodes-as-nodegroups-on-non-gpu-kubernetes-clusters-created-before-june-21st-2023 "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +The instructions are the same as in the previous scenario, with the exception of adding an additional label: + +``` +existing_helm_handler_master_id=$MASTER_0_SERVER_ID + +``` + +where **$MASTER\_0\_SERVER\_ID** is the ID of the **master0** VM from your cluster. The **uuid** value can be obtained + +> * in Horizon, through the Instances view +> * or using a CLI command to isolate the *uuid* for the master node: + +``` +openstack coe nodegroup list $CLUSTER_ID_OLDER \ +-c uuid \ +-c name \ +-c status \ +-c role + +``` + +![older_uuid.png](../_images/older_uuid.png) + +In this example, **uuid** is **413c7486-caa9-4e12-be3b-3d9410f2d32f**. Set up the value for master handler label: + +``` +export MASTER_0_SERVER_ID="413c7486-caa9-4e12-be3b-3d9410f2d32f" + +``` + +and execute the following command to create an additional nodegroup in this scenario: + +``` +openstack coe nodegroup create $CLUSTER_ID_OLDER gpu \ +--labels "worker_type=gpu,existing_helm_handler_master_id=$MASTER_0_SERVER_ID" \ +--merge-labels \ +--role worker \ +--flavor vm.a6000.2 \ +--node-count 1 + +``` + +There may not be any space between the labels. + +The request will be accepted and after a while, a new nodegroup will be available and based on GPU flavor. List the nodegroups with the command: + +``` +openstack coe nodegroup list $CLUSTER_ID_OLDER --max-width 120 + +``` + +Scenario 3 - Create a new GPU-first Kubernetes cluster with vGPU-enabled default nodegroup[](#scenario-3-create-a-new-gpu-first-kubernetes-cluster-with-vgpu-enabled-default-nodegroup "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +To create a new vGPU-enabled cluster, you can use the usual Horizon commands, selecting one of the existing templates with **vgu** in their names: + +![gpu_templates.png](../_images/gpu_templates.png) + +In the below example, we use the CLI to create a cluster called **k8s-gpu-with\_template** with **k8s-1.23.16-vgpu-v1.0.0** template. The sample cluster has + +> * one master node with flavor **eo1.medium** and +> * one worker node with **vm.a6000.2** flavor with vGPU enabled. + +To adjust these parameters to your requirements, you will need to replace the $KEYPAIR to your own. Also, to verify that the nvidia labels are correctly installed, first create a namespace called **nvidia-device-plugin**. You can then list the namespaces to be sure that it was created properly. So, the preparation commands look like this: + +``` +export KEYPAIR="sshkey" +kubectl create namespace nvidia-device-plugin +kubectl get namespaces + +``` + +The final command to create the required cluster is: + +``` +openstack coe cluster create k8s-gpu-with_template \ +--cluster-template "k8s-1.23.16-vgpu-v1.0.0" \ +--keypair=$KEYPAIR \ +--master-count 1 \ +--node-count 1 + +``` + +### Verify the vGPU installation[](#verify-the-vgpu-installation "Permalink to this headline") + +You can verify that vGPU-enabled nodes were properly added to your cluster, by checking the **nvidia-device-plugin** deployed in the cluster, to the **nvidia-device-plugin** namespace. The command to list the contents of the **nvidia** namespace is: + +``` +kubectl get daemonset nvidia-device-plugin \ +-n nvidia-device-plugin + +``` + +![daemonset_01.png](../_images/daemonset_01.png) + +See which nodes are now present: + +``` +kubectl get node + +``` + +![kubectl_get_node.png](../_images/kubectl_get_node.png) + +Each GPU node, should have several **nvidia** labels added. To verify, you can run one of the below commands, the second of which will show the labels formatted: + +``` +kubectl get node k8s-gpu-cluster-XXXX --show-labels +kubectl get node k8s-gpu-cluster-XXXX \ +-o go-template='{{range $key, $value := .metadata.labels}}{{$key}}: {{$value}}{{"\n"}}{{end}}' + +``` + +Concretely, in our case, the second command is: + +``` +kubectl get node k8s-gpu-with-template-lfs5335ymxcn-node-0 \ +-o go-template='{{range $key, $value := .metadata.labels}}{{$key}}: {{$value}}{{"\n"}}{{end}}' + +``` + +and the result will look like this: + +![go_template_image.png](../_images/go_template_image.png) + +Also, GPU workers are tainted by default with the taint: + +``` +node.cloudferro.com/type=gpu:NoSchedule + +``` + +This can be verified by running the following command, in which we are using the name of the existing node: + +``` +kubectl describe node k8s-gpu-with-template-lfs5335ymxcn-node-0 | grep 'Taints' + +``` + +### Run test vGPU workload[](#run-test-vgpu-workload "Permalink to this headline") + +We can run a sample workload on vGPU. To do so, create a YAML manifest file **vgpu-pod.yaml**, with the following contents: + +**vgpu-pod.yaml** + +``` +apiVersion: v1 +kind: Pod +metadata: + name: gpu-pod +spec: + restartPolicy: Never + containers: + - name: cuda-container + image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2 + resources: + limits: + nvidia.com/gpu: 1 # requesting 1 vGPU + tolerations: + - key: nvidia.com/gpu + operator: Exists + effect: NoSchedule + - effect: NoSchedule + key: node.cloudferro.com/type + operator: Equal + value: gpu + +``` + +Apply with: + +``` +kubectl apply -f vgpu-pod.yaml + +``` + +![apply_yaml.png](../_images/apply_yaml.png) + +This pod will request one vGPU, so effectively it will utilize the vGPU allocated to a single node. For example, if you had a cluster with 2 vGPU-enabled nodes, you could run 2 pods requesting 1 vGPU each. + +Also, for scheduling the pods on GPU, you will need to apply the two *tolerations* as per the example above, That, effectively, means that the pod will only be scheduled on GPU nodes. + +Looking at the logs, we see that the workload was indeed performed: + +``` +kubectl logs gpu-pod + +[Vector addition of 50000 elements] +Copy input data from the host memory to the CUDA device +CUDA kernel launch with 196 blocks of 256 threads +Copy output data from the CUDA device to the host memory +Test PASSED +Done + +``` + +Add non-GPU nodegroup to a GPU-first cluster[](#add-non-gpu-nodegroup-to-a-gpu-first-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +We refer to GPU-first clusters as the ones created with **worker\_type=gpu** flag. For example, in cluster created with Scenario No. 3, the default nodegroup consists of vGPU nodes. + +In such clusters, to add an additional, non-GPU nodegroup, you will need to: + +> * specify the image ID of the system that manages this nodegroup +> * add the label **worker\_type=default** +> * ensure that the flavor for this nodegroup is non-GPU. + +In order to retrieve the image ID, you need to know with which template you want to use to create the new nodegroup. Out of the existing non-GPU templates, we select **k8s-1.23.16-v1.0.2** for this example. Run the following command to extract the template ID, as that will be needed for nodegroup creation: + +``` +openstack coe cluster \ +template show k8s-1.23.16-v1.0.2 | grep image_id + +``` + +In our case, this yields the following result: + +![template_show_non_gpu.png](../_images/template_show_non_gpu.png) + +We can then add the non-GPU nodegroup with the following command, in which you can adjust the parameters. In our example, we use cluster name from Scenario 3 (the one freshly created with GPU) above and set up worker node flavor to **eo1.medium**: + +``` +export CLUSTER_ID="k8s-gpu-with_template" +export IMAGE_ID="42696e90-57af-4124-8e20-d017a44d6e24" +openstack coe nodegroup create $CLUSTER_ID default \ +--labels "worker_type=default" \ +--merge-labels \ +--role worker \ +--flavor "eo1.medium" \ +--image $IMAGE_ID \ +--node-count 1 + +``` + +Then list the nodegroup contents to see whether the creation succeeded: + +``` +openstack coe nodegroup list $CLUSTER_ID \ +--max-width 120 + +``` + +![nodegroups_in_cluster_id.png](../_images/nodegroups_in_cluster_id.png) \ No newline at end of file diff --git a/docs/kubernetes/Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html.md b/docs/kubernetes/Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html.md new file mode 100644 index 0000000..2168564 --- /dev/null +++ b/docs/kubernetes/Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html.md @@ -0,0 +1,148 @@ +Enable Kubeapps app launcher on CloudFerro Cloud Magnum Kubernetes cluster[](#enable-kubeapps-app-launcher-on-brand-name-magnum-kubernetes-cluster "Permalink to this headline") +================================================================================================================================================================================= + +[Kubeapps](https://kubeapps.dev/) app-launcher enables quick deployments of applications on your Kubernetes cluster, with convenient graphical user interface. In this article we provide guidelines for creating Kubernetes cluster with Kubeapps feature enabled, and deploying sample applications. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Brief background - deploying applications on Kubernetes +> * Create a cluster with Kubeapps quick-launcher enabled +> * Access Kubeapps service locally from browser +> * Launch sample application from Kubeapps +> * Current limitations + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +The resources that you require and use will reflect on the state of your account wallet. Check your account statistics at . + +No. 2 **Create Kubernetes cluster from Horizon GUI** + +Know how to create a Kubernetes cluster from Horizon GUI, as described in article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **How to Access Kubernetes cluster post-deployment** + +Access to Linux command line and ability to access cluster, as described in article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **Handling Helm** + +Some familiarity with Helm, to customize app deployments with Kubeapps. See [Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html). + +No. 5 **Access to CloudFerro clouds** + +Kubeapps is available on one of the clouds: WAW3-2, FRA1-2, WAW3-1. + +Background[](#background "Permalink to this headline") +------------------------------------------------------- + +Deploying complex applications on Kubernetes becomes notably more efficient and convenient with Helm. Adding to this convenience, **Kubeapps**, an app-launcher with Graphical User Interface (GUI), provides a user-friendly starting point for application management. This GUI allows to deploy and manage applications on your K8s cluster, limiting the need for deep command-line expertise. + +Kubeapps app-launcher can be enabled during cluster creation time. It will run as a local service, accessible from browser. + +Create Kubernetes cluster with Kubeapps quick-launcher enabled[](#create-kubernetes-cluster-with-kubeapps-quick-launcher-enabled "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Creating Kubernetes cluster with Kubeapps enabled, follows the generic guideline described in Prerequisite No. 2. + +When creating the cluster in Horizon according to this guideline: + +> * insert three labels with below values in the “Advanced” tab and +> * choose to override the labels. + +``` +kubeapps_enabled=true,helm_client_tag=v3.11.3,helm_client_sha256=ca2d5d40d4cdfb9a3a6205dd803b5bc8def00bd2f13e5526c127e9b667974a89 + +``` + +Important + +There may be no spaces between label values. + +Inserting these labels is shown in the image below: + +![image-2024-2-13_13-15-17.png](../_images/image-2024-2-13_13-15-17.png) + +Access Kubeapps service locally from your browser[](#access-kubeapps-service-locally-from-your-browser "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------- + +Once the cluster is created, access the Linux console. You should have **kubectl** command line tool available, as specified in Prerequisite No. 3. + +Kubeapps service is enabled for the kubeapps-operator service account. We need to obtain the token that authenticates this service account with the cluster. + +To print the token, run the following command: + +``` +kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{.secrets[].name}') -o go-template='{{.data.token | base64decode}}' && echo + +``` + +As result, a long token will be printed, similar to the following: + +![image-2024-2-13_14-44-49.png](../_images/image-2024-2-13_14-44-49.png) + +Copy the token. Then run the following command to tunnel the traffic between your local machine and the Kubeapps service: + +``` +kubectl port-forward -n kube-system svc/magnum-apps-kubeapps 8080:80 + +``` + +Type **localhost:8080** in your browser to access Kubeapps, paste the token copied earlier and click **Submit**: + +![image-2024-2-13_15-39-52.png](../_images/image-2024-2-13_15-39-52.png) + +You can now operate Kubeapps: + +![image-2024-2-13_15-48-38.png](../_images/image-2024-2-13_15-48-38.png) + +Launch sample application from Kubeapps[](#launch-sample-application-from-kubeapps "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +Clicking on “Catalog” exposes a long list of applications available for downloads from Kubeapps app-store. + +![image-2024-2-13_16-8-43.png](../_images/image-2024-2-13_16-8-43.png) + +As an example, we will install the Apache webserver and in order to do so, click on the “Apache” box. Note that Kubeapps interface is the graphical shortcut, which behind the scenes installs Helm chart on the cluster. + +Once you familiarize yourself with prerequisites and additional information about this chart, click **Deploy** in the top right corner: + +![image-2024-2-13_15-58-45.png](../_images/image-2024-2-13_15-58-45.png) + +The next screen with the default “Visual Editor” tab enabled, allows to define a few major adjustments to how the service is deployed e.g. specifying the service type or replica count. Access to more detailed configurations (reflecting Helm chart’s *values.yaml* configuration file) is also available in the “YAML editor” GUI tab. + +To follow with the article do not change the defaults, only enter the **Name of deployment** (in our case *apache-test*) and hit **Deploy** with the available version: + +![image-2024-2-13_16-13-21.png](../_images/image-2024-2-13_16-13-21.png) + +Since we deployed a service of type LoadBalancer, we need to wait a few minutes for it to be deployed on the cloud. After this completes, we can see the screen confirming the deployment is complete: + +![image-2024-2-13_16-31-37.png](../_images/image-2024-2-13_16-31-37.png) + +Also, in the console, we can double-check that the Apache service, along with the deployment and pod, were properly deployed. Execute the following commands: + +``` +kubectl get deployments +kubectl get pods +kubectl get services + +``` + +The results will be similar to this: + +![image-2024-2-13_16-29-35.png](../_images/image-2024-2-13_16-29-35.png) + +Current limitations[](#current-limitations "Permalink to this headline") +------------------------------------------------------------------------- + +Both Kubeapps and Helm charts deployed by this launcher are open-source projects, which are continuously evolving. The versions installed on CloudFerro Cloud cloud provide a snapshot of this development, as a convenience feature. + +It is expected that not all applications can be installed with one-click and additional configuration will be needed in each particular case. + +One known limitation is that certain charts will require RWM (ReadWriteMany) persistent volume claims to properly operate. Currently, RWM persistent volumes are not natively available on CloudFerro Cloud cloud. A workaround could be installing NFS server and deploying a StorageClass with RWM-supportive provisioner e.g. using [nfs-subdir-external-provisioner](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner) project from GitHub. + +For NFS on Kubernetes cluster, see [Create and access NFS server from Kubernetes on CloudFerro Cloud](Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/kubernetes/GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html.md b/docs/kubernetes/GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html.md new file mode 100644 index 0000000..419ed0b --- /dev/null +++ b/docs/kubernetes/GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html.md @@ -0,0 +1,273 @@ +GitOps with Argo CD on CloudFerro Cloud Kubernetes[](#gitops-with-argo-cd-on-brand-name-kubernetes "Permalink to this headline") +================================================================================================================================= + +Argo CD is a continuous deployment tool for Kubernetes, designed with GitOps and Infrastructure as Code (IaC) principles in mind. It automatically ensures that the state of applications deployed on a Kubernetes cluster is always in sync with a dedicated Git repository where we define such desired state. + +In this article we will demonstrate installing Argo CD on a Kubernetes cluster and deploying an application using this tool. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install Argo CD +> * Access Argo CD from your browser +> * Create Git repository and push your app deployment configurations +> * Create and deploy Argo CD application resource +> * View the deployed resources + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Kubernetes cluster** + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Access to cluster with kubectl** + +[How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **Familiarity with Helm** + +Here is how to install and start using Helm charts: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 5 **Access to your own Git repository** + +You can host the repository for this article on GitLab instance created in article [Install GitLab on CloudFerro Cloud Kubernetes](Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html). You may also use it with [GitHub](https://github.com/git-guides/install-git), [GitLab](https://docs.gitlab.com/ee/topics/git/how_to_install_git/) and other source control platforms based on **git**. + +No. 6 **git CLI operational** + +**git** command installed locally. You may use it with [GitHub](https://github.com/git-guides/install-git), [GitLab](https://docs.gitlab.com/ee/topics/git/how_to_install_git/) and other source control platforms based on **git**. + +No. 7 **Access to exemplary Flask application** + +You should have access to the [example Flask application](https://github.com/CloudFerro/K8s-samples/tree/main/Flask-K8s-deployment), to be downloaded from GitHub in the article. It will serve as an example of a minimal application and by changing it, we will demonstrate that Argo CD is capturing those changes in a continual manner. + +Step 1 Install Argo CD[](#step-1-install-argo-cd "Permalink to this headline") +------------------------------------------------------------------------------- + +Let’s install Argo CD first, under the following assumptions: + +> * this article has been tested on Kubernetes version 1.25 +> * use GUI only (no CLI used in this guide) +> * deploy Argo CD without TLS certificates. + +[Here is an in-depth installation guide](https://argo-cd.readthedocs.io/en/stable/getting_started/). + +For production scenarios, it is [recommended to apply TLS](https://argo-cd.readthedocs.io/en/stable/operator-manual/tls/). + +Let’s first create a dedicated namespace within our existing Kubernetes cluster. The namespace should be explicitly named **argocd**: + +``` +kubectl create namespace argocd + +``` + +Then install Argo CD: + +``` +kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml + +``` + +Step 2 Access Argo CD from your browser[](#step-2-access-argo-cd-from-your-browser "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +The Argo CD web application by default is not accessible from the browser. To enable this, change the applicable service from **ClusterIP** to **LoadBalancer** type with the command: + +``` +kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}' + +``` + +After 1-2 minutes, retrieve the IP address of the service: + +``` +kubectl get service argocd-server -n argocd + +``` + +In our case, this provides the below result and indicates we have Argo CD running on IP address **185.254.233.247**: + +![image-2024-5-14_14-54-10.png](../_images/image-2024-5-14_14-54-10.png) + +Type the IP address you extracted to your browser (it will be a different IP address in your case, so be sure to replace **185.254.233.247** cited here with your own address). You will expectedly get a warning of invalid certificate. To suppress the warning, click “Advanced” and then “Proceed to Unsafe” and be transferred to the login screen of Argo CD: + +![image-2024-5-14_15-4-21.png](../_images/image-2024-5-14_15-4-21.png) + +The login is **admin**. To get the password, extract it from the deployed Kubernetes secret with the following command: + +``` +kubectl get secret argocd-initial-admin-secret -n argocd -ojsonpath='{.data.password}' | base64 --decode ; echo + +``` + +After typing in your credentials to the login form, you get transferred to the following screen: + +![image-2024-5-14_15-34-0.png](../_images/image-2024-5-14_15-34-0.png) + +Step 3 Create a Git repository[](#step-3-create-a-git-repository "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +You need to create a git repository first. The state of the application on your Kubernetes cluster will be synced to the state of this repo. It is recommended that it is a separate repository from your application code, to avoid triggering the CI pipelines whenever we change the configuration. + +You will copy to this newly created repository files already available in (a different) GitHub repo mentioned in the **Prerequisite No. 5 Git CLI operational**. + +Create the repository first, we call ours **argocd-sample**. While filling in the form, check off the initialization with README and choose Public visibility: + +![image-2024-5-22_10-38-53.png](../_images/image-2024-5-22_10-38-53.png) + +In that view, project URL will be pre-filled and corresponding to the URL of your GitLab instance. In the place denoted with a blue rectangle, you should enter your user name; usually, it will be **root** but can be anything else. If there already are some users defined in GitLab, their names will appear in a drop-down menu. + +Step 4 Download Flask application[](#step-4-download-flask-application "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +The next goal is to download two yaml files to a folder called **ArgoCD-sample** and its subfolder **deployment**. + +After submitting the “Create project” form, you will receive a list of commands to work with your repo. Review them and switch to the CLI from Prerequisite No. 6. Clone the entire CloudFerro K8s samples repo, then extract the sub-folder called *Flask-K8s-deployment*. For clarity, we rename its contents to a new folder, **ArgoCD-sample**. Use + +``` +mkdir ~/ArgoCD-sample + +``` + +if this is the first time you are working through this article. Then apply the following set of commands: + +``` +git clone https://github.com/CloudFerro/K8s-samples +mv ~/K8s-samples/Flask-K8s-deployment ~/ArgoCD-sample/deployment +rm K8s-samples/ -rf + +``` + +Files **deployment.yaml** and **service.yaml** deploy a sample Flask application on Kubernetes and expose it as a service. These are typical minimal examples for deployment and service and can be obtained from the CloudFerro Kubernetes samples repository. + +Step 5 Push your app deployment configurations[](#step-5-push-your-app-deployment-configurations "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------- + +Then you need to upload files **deployment.yaml** and **service.yaml** files to the remote repository. Since you are using git, you perform the upload by *syncing* your local repo with the remote. First initiate the repo locally, then push the files to your remote with the following commands (replace to your own git repository instance): + +``` +cd ArgoCD-sample +git init +git remote add origin [email protected]:root/ArgoCD-sample.git +git add . +git commit -m "First commit" +git push origin master + +``` + +As a result, at this point, we have the two files available in remote repository, in deployment folder: + +![image-2024-5-17_11-20-27.png](../_images/image-2024-5-17_11-20-27.png) + +Step 6 Create Argo CD application resource[](#step-6-create-argo-cd-application-resource "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +Argo CD configuration for a specific application is defined using an application custom resource. Such resource connects a Kubernetes cluster with a repository where deployment configurations are stored. + +Directly in the **ArgoCD-sample** folder, create file **application.yaml**, which will represent the application; be sure to replace **gitlab.mysampledomain.info** with your own domain. + +**application.yaml** + +``` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: myapp-application + namespace: argocd +spec: + project: default + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true + source: + repoURL: https://gitlab.mysampledomain.info/root/argocd-sample.git + targetRevision: HEAD + path: deployment + destination: + server: https://kubernetes.default.svc + namespace: myapp + +``` + +Some explanations of this file: + +spec.project.default +: Specifies that our application is associated with the default project (represented as *appproject* CRD in Kubernetes). Additional projects can be created and used for managing multiple applications. + +spec.syncPolicy.syncOptions.CreateNamespace=true +: Ensures that a namespace (specified in spec.destination.namespace) will be automatically created on our cluster if it does not exist already + +spec.syncPolicy.automated.selfHeal: true +: Ensures that any manual changes in the cluster (e.g. applied using kubectl) will trigger a synchronization with the Git repo, overwrite these manual changes and therefore ensure consistency between the cluster and the repo state. + +spec.syncPolicy.automated.prune: true +: Ensures that deletion of a resource definition in the repo will also delete this resource from the Kubernetes cluster + +spec.source.repoURL +: This is the URL of our git repository where deployment artifacts reside. + +spec.source.targetRevision.HEAD +: Ensures that Kubernetes cluster will be synced with the most recent update on the git repository. + +spec.source.source.path +: The name of the folder in the Git repository, where the yaml manifests are stored. + +spec.destination.server +: The address of the Kubernetes cluster where we deploy our app. Since this is the same cluster where Argo CD is running, it can be accessed using the cluster’s internal DNS addressing. + +spec.destination.namespace +: The namespace in the cluster where the application will be deployed. + +Step 7 Deploy Argo CD application[](#step-7-deploy-argo-cd-application "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +After we created the **application.yaml** file, the next step is to commit it and push to the remote repo. We can do this with the following commands: + +``` +git add -A +git commit -m "Added application.yaml file" +git push origin master + +``` + +The final step is to apply the **application.yaml** configuration to the cluster with the command below: + +``` +kubectl apply -f application.yaml + +``` + +Step 8 View the deployed resources[](#step-8-view-the-deployed-resources "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +After performing the steps above, switch views to the Argo CD UI. We can see that our application appears on the list of applications and that the state to be applied on the cluster was properly captured from the Git repo. It will take a few minutes to complete the deployment of resources on the cluster: + +![image-2024-5-22_10-23-58.png](../_images/image-2024-5-22_10-23-58.png) + +This is the view of our app after deployment was properly applied: + +![image-2024-5-22_10-27-25.png](../_images/image-2024-5-22_10-27-25.png) + +After clicking on the application’s box, we can also see the details of all the resources which contribute to this deployment, both high-level and low-level ones. + +![image-2024-5-22_11-17-12.png](../_images/image-2024-5-22_11-17-12.png) + +With the default settings, Argo CD will poll the Git repository every 3 minutes to capture the desired state of the cluster. If any changes in the repo are detected, the applications on the cluster will be automatically relaunched with the new configuration applied. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +* test applying changes to the deployment in the repository (e.g. commit a deployment with different image in the container spec), verify ArgoCD capturing the change and changing the cluster state +* customize the deployment of Argo CD to enable HTTPS +* integrate Argo CD with your identity management tool; for details, see [Deploy Keycloak on Kubernetes with a sample app on CloudFerro Cloud](Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html) + +Also of interest would be the following article: [CI/CD pipelines with GitLab on CloudFerro Cloud Kubernetes - building a Docker image](CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html) \ No newline at end of file diff --git a/docs/kubernetes/HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html.md b/docs/kubernetes/HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..c0af0d2 --- /dev/null +++ b/docs/kubernetes/HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html.md @@ -0,0 +1,332 @@ +HTTP Request-based Autoscaling on K8S using Prometheus and Keda on CloudFerro Cloud[](#http-request-based-autoscaling-on-k8s-using-prometheus-and-keda-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================== + +Kubernetes pod autoscaler (HPA) natively utilizes CPU and RAM metrics as the default triggers for increasing or decreasing number of pods. While this is often sufficient, there can be use cases where scaling on custom metrics is preferred. + +[KEDA](https://keda.sh/) is a tool for autoscaling based on events/metrics provided from popular sources/technologies such as Prometheus, Kafka, Postgres and multiple others. + +With this article we will deploy a sample app on CloudFerro Cloud cloud. We will collect HTTP requests from NGINX Ingress on our Kubernetes cluster and, using Keda with Prometheus scaler, apply custom HTTP request-based scaling. + +Note + +We will use *NGINX web server* to demonstrate the app, and *NGINX ingress* to deploy it and collect metrics. Note that *NGINX web server* and *NGINX ingress* are two separate pieces of software, with two different purposes. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install NGINX ingress on Magnum cluster +> * Install Prometheus +> * Install Keda +> * Deploy a sample app +> * Deploy our app ingress +> * Access Prometheus dashboard +> * Deploy KEDA ScaledObject +> * Test with Locust + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** +: You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Create a new Kubernetes cluster without Magnum NGINX preinstalled from Horizon UI** + +The default NGINX ingress deployed from Magnum from Horizon UI does not yet implement Prometheus metrics export. Instead of trying to configure Magnum ingress for this use case, we will rather install a new NGINX ingress. To avoid conflicts, best to follow the below instruction on a Kubernetes cluster **without** Magnum NGINX preinstalled from Horizon UI. + +No. 3 **kubectl pointed to the Kubernetes cluster** + +The following article gives options for creating a new cluster and activating the **kubectl** command: + +[How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +As mentioned, create the cluster **without** installing the NGINX ingress option. + +No. 4 **Familiarity with deploying Helm charts** + +This article will introduce you to Helm charts on Kubernetes: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +Install NGINX ingress on Magnum cluster[](#install-nginx-ingress-on-magnum-cluster "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +Please type in the following commands to download the *ingress-nginx* Helm repo and then install the chart. Note we are using a custom namespace *ingress-nginx* as well as setting the options to enable Prometheus metrics. + +``` +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update + +kubectl create namespace ingress-nginx + +helm install ingress-nginx ingress-nginx/ingress-nginx \ +--namespace ingress-nginx \ +--set controller.metrics.enabled=true \ +--set-string controller.podAnnotations."prometheus\.io/scrape"="true" \ +--set-string controller.podAnnotations."prometheus\.io/port"="10254" + +``` + +Now run the following command to get the external IP address of the ingress controller, which will be used by ingress resources created in the further steps of this article. + +``` +$ kubectl get services -n ingress-nginx +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +ingress-nginx-controller LoadBalancer 10.254.118.18 64.225.135.67 80:31573/TCP,443:30786/TCP 26h + +``` + +We get **64.225.135.67**. Instead of that value, use the EXTERNAL-IP value you get in your terminal after running the above command. + +Install Prometheus[](#install-prometheus "Permalink to this headline") +----------------------------------------------------------------------- + +In order to install Prometheus, please apply the following command on your cluster: + +``` +kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/prometheus/ + +``` + +Note that this is Prometheus installation customized for NGINX Ingress and already installs to the *ingress-nginx* namespace by default, so no need to provide the namespace flag or create one. + +Install Keda[](#install-keda "Permalink to this headline") +----------------------------------------------------------- + +With below steps, create a separate namespace for Keda artifacts, download the repo and install the Keda-Core chart: + +``` +kubectl create namespace keda + +helm repo add kedacore https://kedacore.github.io/charts +helm repo update + +helm install keda kedacore/keda --version 2.3.0 --namespace keda + +``` + +Deploy a sample app[](#deploy-a-sample-app "Permalink to this headline") +------------------------------------------------------------------------- + +With the above steps completed, we can deploy a simple application. It will be an NGINX web server, serving a simple “Welcome to nginx!” page. Note, we create a deployment and then expose this deployment as a service of type ClusterIP. Create a file *app-deployment.yaml* in your favorite editor: + +**app-deployment.yaml** + +``` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + selector: + matchLabels: + app: nginx + replicas: 1 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx +--- +apiVersion: v1 +kind: Service +metadata: + name: nginx +spec: + selector: + app: nginx + type: ClusterIP + ports: + - protocol: TCP + port: 80 + targetPort: 80 + +``` + +Then apply with the below command: + +``` +kubectl apply -f app-deployment.yaml -n ingress-nginx + +``` + +We are deploying this application into the *ingress-nginx* namespace where also the ingress installation and Prometheus is hosted. For production scenarios, you might want to have better isolation of application vs. infrastructure, this is however beyond the scope of this article. + +Deploy our app ingress[](#deploy-our-app-ingress "Permalink to this headline") +------------------------------------------------------------------------------- + +Our application is already running and exposed in our cluster, but we want to also expose it publicly. For this purpose we will use NGINX ingress, which will also act as a proxy to register the request metrics. Create a file *app-ingress.yaml* with the following contents: + +**app-ingress.yaml** + +``` +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: app-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + ingressClassName: nginx + rules: + - host: "64.225.135.67.nip.io" + http: + paths: + - backend: + service: + name: nginx + port: + number: 80 + path: /app + pathType: Prefix + +``` + +Then apply with: + +``` +kubectl apply -f app-ingress.yaml -n ingress-nginx + +``` + +After a while, you can get a public IP address where the app is available: + +``` +$ kubectl get ingress -n ingress-nginx +NAME CLASS HOSTS ADDRESS PORTS AGE +app-ingress nginx 64.225.135.67.nip.io 64.225.135.67 80 18h + +``` + +After typing the IP address with the prefix (replace with your own floating IP with /app suffix), we can see the app exposed. We are using the *nip.io* service, which works as a DNS resolver, so there is no need to set up DNS records for the purpose of the demo. + +![welcome_nginx.png](../_images/welcome_nginx.png) + +Access Prometheus dashboard[](#access-prometheus-dashboard "Permalink to this headline") +----------------------------------------------------------------------------------------- + +To access Prometheus dashboard we can port-forward the running prometheus-server to our localhost. This could be useful for troubleshooting. We have the *prometheus-server* running as a *NodePort* service, which can be verified per below: + +``` +$ kubectl get services -n ingress-nginx +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +ingress-nginx-controller LoadBalancer 10.254.3.172 64.225.135.67 80:30881/TCP,443:30942/TCP 26h +ingress-nginx-controller-admission ClusterIP 10.254.51.201 443/TCP 26h +ingress-nginx-controller-metrics ClusterIP 10.254.15.196 10254/TCP 26h +nginx ClusterIP 10.254.160.207 80/TCP 25h +prometheus-server NodePort 10.254.24.85 9090:32051/TCP 26h + +``` + +We will port-forward to the localhost in the following command: + +``` +kubectl port-forward deployment/prometheus-server 9090:9090 -n ingress-nginx + +``` + +Then enter *localhost:9090* in your browser, you will see the Prometheus dashboard. In this view we will be able to see various metrics exposed by nginx-ingress. This can be verified by starting to type “nginx-ingress” to search bar, then various related metrics will start to show up. + +![prometheus-dashboard_9090.png](../_images/prometheus-dashboard_9090.png) + +Deploy KEDA ScaledObject[](#deploy-keda-scaledobject "Permalink to this headline") +----------------------------------------------------------------------------------- + +Keda ScaledObject is a custom resource which will enable scaling our application based on custom metrics. In the YAML manifest we define what will be scaled (the nginx deployment), what are the conditions for scaling, and the definition and configuration of the trigger, in this case Prometheus. Prepare a file *scaled-object.yaml* with the following contents: + +**scaled-object.yaml** + +``` +apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: prometheus-scaledobject + namespace: ingress-nginx + labels: + deploymentName: nginx +spec: + scaleTargetRef: + kind: Deployment + name: nginx # name of the deployment, must be in the same namespace as ScaledObject + minReplicaCount: 1 + pollingInterval: 15 + triggers: + - type: prometheus + metadata: + serverAddress: http://prometheus-server.ingress-nginx.svc.cluster.local:9090 + metricName: nginx_ingress_controller_requests + threshold: '100' + query: sum(rate(nginx_ingress_controller_requests[1m])) + +``` + +For detailed definition of *ScaledObject*, refer to Keda documentation. In this example, we are leaving out a lot of default settings, most notable of which is called *coolDownPeriod*. Being not explicitly assigned a value, its default value of 300 seconds will be in effect, however, see below how you can change that value to something else. + +We are using here the *nginx-ingress-controller-requests* metric for scaling. This metric will only populate in the Prometheus dashboard once the requests start hitting our app service. We are setting the threshold for **100** and the time to **1** minute, so in case there is more requests than **100** per pod in a minute, this will trigger scale up. + +``` +kubectl apply -f scaled-object.yaml -n ingress-nginx + +``` + +Test with Locust[](#test-with-locust "Permalink to this headline") +------------------------------------------------------------------- + +We can now test whether the scaling works as expected. We will use *Locust* for this, which is a load testing tool. To quickly deploy *Locust* as LoadBalancer service type, enter the following commands: + +``` +kubectl create deployment locust --image paultur/locustproject:latest +kubectl expose deployment locust --type LoadBalancer --port 80 --target-port 8089 + +``` + +After a couple of minutes the LoadBalancer is created and Locust is exposed: + +``` +$ kubectl get services +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +kubernetes ClusterIP 10.254.0.1 443/TCP 28h +locust LoadBalancer 10.254.88.89 64.225.132.243 80:31287/TCP 4m19s + +``` + +Enter Locust UI in the browser using the EXTERNAL-IP. It can be only **64.225.132.243** or **64.225.132.243.nip.io**, one of these values is sure to work. Then hit “Start Swarming” to initiate mock requests on our app’s public endpoint: + +![locust_test.png](../_images/locust_test.png) + +With the default setting and even single user, *Locust* will start swarming hundreds of requests immediately. Tuning Locust is not in scope of this article, but we can quickly see the effect. The additional pod replicas are generated: + +``` +$ kubectl get pods -n ingress-nginx +NAME READY STATUS RESTARTS AGE +ingress-nginx-controller-557bf68967-h9zf5 1/1 Running 0 27h +nginx-85b98978db-2kjx6 1/1 Running 0 30s +nginx-85b98978db-2kxzz 1/1 Running 0 61s +nginx-85b98978db-2t42c 1/1 Running 0 31s +nginx-85b98978db-2xdzw 0/1 ContainerCreating 0 16s +nginx-85b98978db-2zdjm 1/1 Running 0 30s +nginx-85b98978db-4btfm 1/1 Running 0 30s +nginx-85b98978db-4mmlz 0/1 ContainerCreating 0 16s +nginx-85b98978db-4n5bk 1/1 Running 0 46s +nginx-85b98978db-525mq 1/1 Running 0 30s +nginx-85b98978db-5czdf 1/1 Running 0 46s +nginx-85b98978db-5kkgq 0/1 ContainerCreating 0 16s +nginx-85b98978db-5rt54 1/1 Running 0 30s +nginx-85b98978db-5wmdk 1/1 Running 0 46s +nginx-85b98978db-6tc6p 1/1 Running 0 77s +nginx-85b98978db-6zcdw 1/1 Running 0 61s +... + +``` + +Cooling down[](#cooling-down "Permalink to this headline") +----------------------------------------------------------- + +After hitting “Stop” in Locust, the pods will scale down to one replica, in line with the value of *coolDownPeriod* parameter, which is defined in the Keda ScaledObject. Its default value is 300 seconds. If you want to change it, use command + +``` +kubectl edit scaledobject prometheus-scaledobject -n ingress-nginx + +``` \ No newline at end of file diff --git a/docs/kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..993fc0b --- /dev/null +++ b/docs/kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,235 @@ +How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum[](#how-to-access-kubernetes-cluster-post-deployment-using-kubectl-on-brand-name-openstack-magnum "Permalink to this headline") +=================================================================================================================================================================================================================================== + +In this tutorial, you start with a freshly installed Kubernetes cluster on Cloudferro OpenStack server and connect the main Kubernetes tool, **kubectl** to the cloud. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to connect **kubectl** to the OpenStack Magnum server +> * How to access clusters with **kubectl** + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Installation of kubectl** + +Standard types of **kubectl** installation are described on [Install Tools page](https://kubernetes.io/docs/tasks/tools/) of the official Kubernetes site. + +No. 3 **A cluster already installed on Magnum site** + +You may already have a cluster installed if you have followed one of these articles: + +> * With Horizon interface: [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). +> * With command line interface: [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +* Or, you may want to create a new cluster called *k8s-cluster*, just for this occasion – by using the following CLI command: + +``` +openstack coe cluster create \ +--cluster-template k8s-stable-1.23.5 \ +--labels eodata_access_enabled=false,floating-ip-enabled=true,master-lb-enabled=true \ +--merge-labels \ +--keypair sshkey \ +--master-count 3 \ +--node-count 2 \ +--master-flavor eo1.large \ +--flavor eo1.large \ +k8s-cluster + +``` + +Warning + +It takes some 10-20 minutes for the new cluster to form. + +In the rest of this text we shall use cluster name *k8s-cluster* – be sure to use the name of the existing cluster instead. + +No. 4 **Connect openstack client to the cloud** + +Prepare **openstack** and **magnum** clients by executing *Step 2 Connect OpenStack and Magnum Clients to Horizon Cloud* from article [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html). + +The Plan[](#the-plan "Permalink to this headline") +--------------------------------------------------- + +> * Follow up the steps listed in Prerequisite No. 2 and install **kubectl** on the platform of your choice. +> * Use the existing Kubernetes cluster on Cloudferro or install a new one using the methods outlined in Prerequisites Nos. 3. +> * Use Step 2 in Prerequisite No. 4 to enable connection of **openstack** and **magnum** clients to the cloud. + +You are then going to connect **kubectl** to the Cloud. + +Step 1 Create directory to download the certificates[](#step-1-create-directory-to-download-the-certificates "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------- + +Create a new directory called *k8sdir* into which the certificates will be downloaded: + +``` +mkdir k8sdir + +``` + +Once the certificate file is downloaded, you will execute a command similar to this: + +``` +export KUBECONFIG=/home/dusko/k8sdir/config + +``` + +This assumes + +> * using an Ubuntu environment (*/home*), +> * that the user is *dusko*, +> * the directory you just created */k8sdir* and, finally, that +> * *config* is the file which contains data for authorizing to the Kubernetes cluster. + +Note + +In Linux, a file may or may not have an extension, while on Windows, it must have an extension. + +Step 2A Download Certificates From the Server using the CLI commands[](#step-2a-download-certificates-from-the-server-using-the-cli-commands "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +You will use command + +``` +openstack coe cluster config + +``` + +to download the files that **kubectl** needs for authentication with the server. See its input parameters using the **–help** parameter: + +``` +openstack coe cluster config --help +usage: openstack coe cluster config [-h] + [--dir ] [--force] [--output-certs] + [--use-certificate] [--use-keystone] + + +Get Configuration for a Cluster + +positional arguments: + The name or UUID of cluster to update + +optional arguments: + -h, --help show this help message and exit + --dir Directory to save the certificate and config files. + --force Overwrite files if existing. + --output-certs Output certificates in separate files. + --use-certificate Use certificate in config files. + --use-keystone Use Keystone token in config files. + +``` + +Download the certificates into the *k8sdir* folder: + +``` +openstack coe cluster config \ +--dir k8sdir \ +--force \ +--output-certs \ +k8s-cluster + +``` + +Four files will be downloaded into the folder: + +``` +ls k8sdir +ca.pem cert.pem config key.pem + +``` + +Parameter *–output-certs* produces *.pem* files, which are X.509 certificates, originally created so that they can be sent via email. File *config* combines the *.pem* files and contains all the information needed for **kubectl** to access the cloud. Using *–force* overwrites the existing files (if any), so you are guaranteed to work with only the latest versions of the files from the server. + +The result of this command is shown in the row below: + +``` +export KUBECONFIG=/home/dusko/k8sdir/config + +``` + +Copy this command and paste it into the command line of terminal, then press the *Enter* key on the keyboard to execute it. System variable KUBECONFIG will be thus initialized and the **kubectl** command will have access to the *config* file at all times. + +This is the entire procedure in terminal window: + +![download_config_cli.png](../_images/download_config_cli.png) + +Step 2B Download Certificates From the Server using Horizon commands[](#step-2b-download-certificates-from-the-server-using-horizon-commands "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +You can download the config file from Horizon directly to your computer. First list the clusters with command **Container Infra** -> **Clusters**, find the cluster and click on the rightmost drop-down menu in its column: + +![download_config_horizon.png](../_images/download_config_horizon.png) + +Click on option **Show Cluster Config** and the config file will be downloaded to the editor: + +![cluster_config_editor.png](../_images/cluster_config_editor.png) + +From the editor, save it on disk. The file name will combine the name of the cluster with the word *config* and if you have downloaded the same file several times, there may be a dash followed by a number, like this: + +``` +k8s-cluster-config-1.yaml + +``` + +For uniformity, save it to the same folder *k8sdir* as the *config* file and set up the KUBECONFIG variable to that address: + +``` +export KUBECONFIG=/home/dusko/k8sdir/k8s-cluster_config-1.yaml + +``` + +Depending on your environment, you may need to open a new terminal window to make the above command work. + +Step 3 Verify That kubectl Has Access to the Cloud[](#step-3-verify-that-kubectl-has-access-to-the-cloud "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------- + +See basic data about the cluster with the following command: + +``` +kubectl get nodes -o wide + +``` + +The result is: + +![get_nodes_large.png](../_images/get_nodes_large.png) + +That verifies that **kubectl** has proper access to the cloud. + +To see available commands **kubectl** has, use: + +``` +kubectl --help + +``` + +The listing is too long to reproduce here, but here is how it starts: + +![kubectl_help.png](../_images/kubectl_help.png) + +**kubectl** also has a long list of options, which are parameters that can be applied to any command. See them with + +``` +kubectl options + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +With **kubectl** operational, you can + +> * deploy apps on the cluster, +> * access multiple clusters, +> * create load balancers, +> * access applications in the cluster using port forwarding, +> * use Service to access application in a cluster, +> * list container images in the cluster +> * use Services, Deployments and all other resources in a Kubernetes cluster. + +Kubernetes dashboard is a visual alternative to **kubectl**. To install it, see [Using Dashboard To Access Kubernetes Cluster Post Deployment On CloudFerro Cloud OpenStack Magnum](Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html). \ No newline at end of file diff --git a/docs/kubernetes/How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..ae15637 --- /dev/null +++ b/docs/kubernetes/How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,223 @@ +How To Create API Server LoadBalancer for Kubernetes Cluster on CloudFerro Cloud OpenStack Magnum[](#how-to-create-api-server-loadbalancer-for-kubernetes-cluster-on-brand-name-openstack-magnum "Permalink to this headline") +=============================================================================================================================================================================================================================== + +Load balancer can be understood both as + +> * an external IP address through which the network / Internet traffic is coming into the Kubernetes cluster as well as +> * the piece of software that decides to which of the master nodes to send the incoming traffic. + +There is an option to create load balancer while creating the Kubernetes cluster but you can also create it without. This article will show you how to access the cluster even if you did not specify load balancer at the creation time. + +What We Are Going To Do[](#what-we-are-going-to-do "Permalink to this headline") +--------------------------------------------------------------------------------- + +> * Create a cluster called NoLoadBalancer with one master node and no load balancer +> * Assign floating IP address to its master node +> * Create *config* file to access the cluster +> * In that *config* file, swap local server address with the actual floating IP of the master node +> * Use parameter **–insecure-skip-tls-verify=true** to override server security +> * Verify that **kubectl** is working normally, which means that you have full access to the Kubernetes cluster + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Installation of the openstack command** + +To activate **kubectl** command, the openstack command from CLI OpenStack Interface must be operational. The first part of article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) shows how to install it. + +No. 3 **How to create Kubernetes cluster using Horizon commands** + +The article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) shows creation of clusters with Horizon visual interface. (In this article, you shall use it to create an exemplar cluster called *NoLoadBalancer*.) + +No. 4 **Connect to the Kubernetes Cluster in Order to Use kubectl** + +Article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) will show you how to connect your local machine to the existing Kubernetes cluster. + +How To Enable or Disable Load Balancer for Master Nodes[](#how-to-enable-or-disable-load-balancer-for-master-nodes "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------- + +A default state for the Kubernetes cluster in CloudFerro Cloud OpenStack Magnum hosting is to have no load balancer set up in advance. You can decide to have a load balancer created together with the basic Kubernetes cluster by checking on option **Enable Load Balancer for Master Nodes** in window **Network** when creating a cluster through Horizon interface. (See **Prerequisite No. 3** for the complete procedure.) + +The check box to enable load balancer for master nodes has two completely different meanings when checked and not checked. + +**Checked state** + +![enable_load_balancer_checked.png](../_images/enable_load_balancer_checked.png) + +If **checked**, the load balancer for master nodes will be created. If you specified two or more master nodes in previous screens, then this field **must** be checked. + +Regardless of the number of master nodes you have specified, checking this field on yields higher chances of successfully creating the Kubernetes cluster. + +**Non-checked state** + +![enable_load_balancer_unchecked.png](../_images/enable_load_balancer_unchecked.png) + +If you accept the default state of **unchecked**, no load balancer will be created. However, without any load balancer “in front” of the cluster, the cluster API is being exposed only within the Kubernetes network. You save on the existence of the load balancer but the direct connection from local machine to the cluster is lost. + +One Master Node, No Load Balancer and the Problem It All Creates[](#one-master-node-no-load-balancer-and-the-problem-it-all-creates "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +To show exactly what the problem is, use + +> * Prerequisite No. 2 to install openstack client for the local machine, so that you can use the **openstack** command. +> * Then use Prerequisite No. 4 to connect to the OpenStack cloud and start using **openstack** command from the local terminal. + +Then you can try a very usual command such as + +``` +kubectl get nodes + +``` + +but it will not work. If there were load balancer “in front of the cluster”, it would work, but here there isn’t so it won’t. The rest of this article will show you how to still make it work, using the fact that the master node of the cluster has its own load balancer for kube-api. + +Step 1 Create a Cluster With One Master Node and No Load Balancer[](#step-1-create-a-cluster-with-one-master-node-and-no-load-balancer "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Create cluster *NoLoadBalancer* as explained in Prerequisite No. 3. Let there be + +> * one master node and +> * no load balancers (do not check field **Enable Load Balancer for Master Nodes** in subwindow **Network**). +> * Use any key pair that you might have – it is of no concern for this article. +> * Activate NGINX as Ingress controller + +The result will be creation of cluster *NoLoadBalancer* as seen in this image: + +![noloadbalancer_created.png](../_images/noloadbalancer_created.png) + +To illustrate the problem, a very basic command such as + +``` +kubectl get pods NoLoadBalancer -o yaml + +``` + +to list the pods in cluster NoLoadBalancer, will show an error message like this one: + +``` +Unable to connect to the server: dial tcp 10.0.0.54:6443: i/o timeout + +``` + +Addresses starting with 10.0… are usually reserved for local networks, meaning that no access from the Internet is enabled at this time. + +![nodes_address.png](../_images/nodes_address.png) + +Step 2 Create Floating IP for Master Node[](#step-2-create-floating-ip-for-master-node "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------- + +Here are the instances that serve as nodes for that cluster: + +![created_instances.png](../_images/created_instances.png) + +Master node is called *noloadbalancer-3h2i5x5iz2u6-master-0* and click on the right side of its row and click option **Associate Floating IP**. + +To add the IP, click on a selection of available addresses (there may be only one but in certain cases, there can be several to choose from): + +![associate_floating_ip.png](../_images/associate_floating_ip.png) + +This is the result: + +![floating_ip_created.png](../_images/floating_ip_created.png) + +The IP number is **64.225.135.112** – you are going to use it later on, to change *config* file for access to the Kubernetes cluster. + +Step 3 **Create config File for Kubernetes Cluster**[](#step-3-create-config-file-for-kubernetes-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------- + +You are now going to connect to *NoLoadBalancer* cluster in spite of it not having a load balancer from the very start. To that end, create a config file to connect to the cluster, with the following command: + +``` +openstack coe cluster config NoLoadBalancer --force + +``` + +It will return a row such as this: + +``` +export KUBECONFIG=/Users//config + +``` + +Execute this command from terminal command line. A config file has also been created at that address. To show its contents, execute command + +``` +cat config + +``` + +assuming you already are in the required folder. + +Config file will look a lot like gibberish because it contains certificates, tokens and other rows with random content, some of them hundreds of characters long. Here is one part of it: + +![confi_created.png](../_images/confi_created.png) + +The important row here is this network address: + +``` +server: https://10.0.0.54:6443 + +``` + +Step 4 Swap Existing Floating IP Address for the Network Address[](#step-4-swap-existing-floating-ip-address-for-the-network-address "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Now back to Horizon interface and execute commands **Compute** -> **Instances** to see the addresses for master node of the *NoLoadBalancer* cluster: + +![master_node_addresses.png](../_images/master_node_addresses.png) + +There are two addresses: + +``` +10.0.0.54, 64.225.135.112 + +``` + +Incidentally, the same **10.0.0.54** address is also present in the *config* file, ending with port address **:6443**. + +Try now in terminal to execute **kubectl** command and see the result, perhaps like this one: + +![kubectl_without_access.png](../_images/kubectl_without_access.png) + +The access is there but the nodes and pods are still out of reach. That is because address **10.0.0.54** is internal network address for the cluster and was never supposed to work as the Internet address. + +So, open the *config* file using *nano* (or other text editor of your choice). Swap **10.0.0.54** for **64.225.135.112** in line for server access. The address **64.225.135.112** is the address of the floating IP for master node and will fit in perfectly. + +The line should look like this: + +![swapped_address.png](../_images/swapped_address.png) + +Save the edited file. In case of **nano**, those will be commands `Control-x`, `Y` and pressing `Enter` on the keyboard. + +Step 4 Add Parameter –insecure-skip-tls-verify=true to Make kubectl Work[](#step-4-add-parameter-insecure-skip-tls-verify-true-to-make-kubectl-work "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Try again to activate kubectl and again it will fail. To make it work, add parameter **–insecure-skip-tls-verify=true**: + +``` +kubectl get pods --insecure-skip-tls-verify=true + +``` + +Or, try out a more meaningful command + +``` +kubectl get nodes --insecure-skip-tls-verify=true + +``` + +This is the result of all these commands, in terminal window: + +![kubectl_working.png](../_images/kubectl_working.png) + +To continue working successfully, use normal **kubectl** commands and always add **–insecure-skip-tls-verify=true** in the end. + +Attention + +Using parameter **–insecure-skip-tls-verify** won’t check cluster certificates for validity. That will make your **https** connections insecure. Not recommended for production environment. Use at your own risk, maybe for some local testing or when you are just learning about Kubernetes and clusters. + +For production, it is strongly recommended to check on field **Enable Load Balancer for Master Nodes** when creating a new cluster, regardless of the number of master nodes you have specified. \ No newline at end of file diff --git a/docs/kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html.md b/docs/kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html.md new file mode 100644 index 0000000..a94e95c --- /dev/null +++ b/docs/kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html.md @@ -0,0 +1,196 @@ +How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon[](#how-to-install-openstack-and-magnum-clients-for-command-line-interface-to-brand-name-horizon "Permalink to this headline") +================================================================================================================================================================================================================================= + +How To Issue Commands to the OpenStack and Magnum Servers[](#how-to-issue-commands-to-the-openstack-and-magnum-servers "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------- + +There are three ways of working with Kubernetes clusters within Openstack Magnum and Horizon modules: + +**Horizon Commands** + +You issue Horizon commands using mouse and keyboard, through predefined screen wizards. It is the easiest way to start but not the most productive in the long run. + +**Command Line Interface (CLI)** + +CLI commands are issued from desktop computer or server in the cloud. This approach allows you to save commands as text and repeat them afterwards. This is the preferred way for professionals. + +**HTTPS Requests to the Magnum Server** + +Both the Horizon and the CLI use HTTPS requests internally and in an interactive manner. You can, however, write your own software to automate and/or change the state of the server, in real time. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to install the CLI – OpenStack and Magnum clients +> * How to connect the CLI to the Horizon server +> * Basic examples of using OpenStack and Magnum clients + +Notes On Python Versions and Environments for Installation[](#notes-on-python-versions-and-environments-for-installation "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------- + +OpenStack is written in Python so you need to first install a Python working environment and then install the OpenStack clients. Officially, OpenStack runs only on Python 2.7 but you will most likely only be able to install a version 3.x of Python. During the installation, adjust accordingly the numbers of Python versions mentioned in the documentation. + +You will be able to install Python on any of the popular platforms, such as Windows, MacOS, Linux on a desktop computer. Or, supposing you are logged into Horizon interface, you can use commands **Compute** => **Instances** to create an instance of a virtual machine. Then install the Python there. Ubuntu 18.04 or 20.04 would serve best in this regard. + +Warning + +Once you install Kubernetes cluster you will have also have installed instances with Fedora 33 or 35, say, for the master node of the control plane. You can install the Python and OpenStack clients there as well but Ubuntu is much easier to use and is the preferred solution in this case. + +You can install the Python and the clients on several environments at once, say, on a desktop computer and on a virtual machine on the server, at the same time. Following the instructions in this tutorial, they will all be connected to one and the same Kubernetes cluster anyway. + +Note + +If you decide to install Python and the OpenStack clients on a virtual machine, you will need SSH keys in order to be able to enter the working environment. See [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Installation of OpenStack CLI on Ubuntu 20.04 Server** + +The article [How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) shows how to install OpenStack client on Ubuntu server. That Ubuntu may be the desktop operating system, a virtual machine on some other operating system, or an Ubuntu server in the cloud. + +Installation on Mac OS will be similar to the installation on Ubuntu. + +No. 3 **Installation of OpenStack CLI on Windows** + +The article [How to install OpenStackClient GitBash for Windows on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html) shows installation on Windows. + +No. 4 **General Instructions for Installation of OpenStack Clients** + +There are various ways of installing Python and the required clients. For instance, on MacOS, you can install the clients using Python PIP or install them natively, using *homebrew*. + +The article [Install the OpenStack command-line clients](https://docs.openstack.org/newton/user-guide/common/cli-install-openstack-command-line-clients.html) will give a systematic introduction to installation of OpenStack family of clients on various operating systems. + +Once installed, the CLI commands will be identical across various platforms and operating systems. + +No. 5 **Connect openstack command to the cloud** + +After the successful installation of **openstack** command, it should be connected to the cloud. Follow this article for technical details: [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html). + +Step 1 Install the CLI for Kubernetes on OpenStack Magnum[](#step-1-install-the-cli-for-kubernetes-on-openstack-magnum "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------- + +In this step, you are going to install clients for commands **openstack** and **coe**, from modules OpenStack and Magnum, respectively. + +Follow the Prerequisites Nos. 2, 3 or 4 to install the main client for OpenStack. Its name is *python-openstackclient* and the installation described in those will typically contain a command such as + +``` +pip install python-openstackclient + +``` + +If you have installed OpenStackClient using those prerequisite resources, we shall assume that the **openstack** is available and connected to the cloud. + +At the end of installation from either of the prerequisite articles, install Magnum client by issuing this command: + +``` +pip install python-magnumclient + +``` + +Step 2 How to Use the OpenStack Client[](#step-2-how-to-use-the-openstack-client "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +In this step, you are going to start using the OpenStack client you have installed and connected to the cloud. + +There are two ways of using the OpenStackClient. If you enter the word **openstack** at the command prompt of the terminal, you will enter the special command line interface, like this: + +![openstack_cli.png](../_images/openstack_cli.png) + +The benefit would be that you do not have to type **openstack** keyword for every command. + +Type **quit** to leave the **openstack** internal command line prompt. + +The preferred way, however, is typing the keyword **openstack**, followed by parameters and running from terminal command line. + +Openstack commands may have dozens of parameters so it is better to compose the command in an independent text editor and then copy and paste it into the terminal. + +The Help Command[](#the-help-command "Permalink to this headline") +------------------------------------------------------------------- + +To learn about the available commands and their parameters, type **–help** after the command. If applied to the keyword **openstack** itself, it will write out a very long list of commands, which may come useful as an orientation. It may start out like this: + +![openstack_help.png](../_images/openstack_help.png) + +This is how it ends: + +![openstack_vim.png](../_images/openstack_vim.png) + +The colon in the last line means that the output is in **vi** (or **vim**) editor. To leave it, type letter **q** and press Enter on the keyboard. + +Prerequisites No. 3 and 4 lead to official OpenStack user documentation. + +Here is what happens when you enter a wrong parameter, say, *networks* instead of *network*: + +``` +openstack networks list + +``` + +![networks_list.png](../_images/networks_list.png) + +You get a list of commands similar to what you just typed. + +To list networks available in the system, use a singular version of the command: + +``` +openstack network list + +``` + +![network_list.png](../_images/network_list.png) + +Step 4 How to Use the Magnum Client[](#step-4-how-to-use-the-magnum-client "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +OpensStack command for the server is **openstack** but for Magnum, the command is not **magnum** as one would expect, but **coe**, for *container orchestration engine*. Therefore, the commands for clusters will always start with **openstack coe**. + +See cluster commands by entering + +``` +openstack coe + +``` + +into the command line: + +![openstack_coe.png](../_images/openstack_coe.png) + +You can see the existing clusters using the following command: + +``` +openstack coe cluster list + +``` + +![openstack_coe_cluster_list.png](../_images/openstack_coe_cluster_list.png) + +This is more or less the same information that you can get from the Horizon interface: + +![cluster_list_horizon.png](../_images/cluster_list_horizon.png) + +after clicking on **Container Infra** => **Clusters**. + +Prerequisite No. 5 offers more technical info about the Magnum client. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +In this tutorial you have + +> * installed the *OpenStack* and *Magnum* clients +> * connected them to the server, then used +> * **openstack** command to access the server in general and +> * **coe** to access the clusters in particular. + +> The article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) explains + +* the advantages of using the CLI instead of Horizon interface, showing +* how to create a cluster template as well as +* how to create a new cluster + +all via the CLI. \ No newline at end of file diff --git a/docs/kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..6c5b9e2 --- /dev/null +++ b/docs/kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,368 @@ +How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum[](#how-to-use-command-line-interface-for-kubernetes-clusters-on-brand-name-openstack-magnum "Permalink to this headline") +========================================================================================================================================================================================================================= + +In this article you shall use Command Line Interface (CLI) to speed up testing and creation of Kubernetes clusters on OpenStack Magnum servers. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * The advantages of using CLI over the Horizon graphical interface +> * Debugging OpenStack and Magnum commands +> * How to create a new Kubernetes cluster template using CLI +> * How to create a new Kubernetes cluster using CLI +> * Reasons why the cluster may fail to create +> * CLI commands to delete a cluster + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Private and public keys** + +An SSH key-pair created in OpenStack dashboard. To create it, follow this article [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). You will have created keypair called *sshkey* and you will be able to use it for this tutorial as well. + +No. 3 **Command Structure of OpenStack Client Commands** + +Here is the manual for OpenStackClient commands: [Command Structure Xena version](https://docs.openstack.org/python-openstackclient/xena/cli/commands.html). + +No. 4 **Command List of OpenStack Client Commands** + +These are all the commands supported by Xena release of OpenStackClient: [Xena Command List](https://docs.openstack.org/python-openstackclient/xena/cli/command-list.html). + +No. 5 **Documentation for Magnum client** + +These are all the commands supported by Xena release of MagnumClient: [Magnum User Guide](https://docs.openstack.org/magnum/latest/user/). + +No. 6 **How to install OpenStack and Magnum Clients** + +The step that directly precedes this article is: [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html). + +In that guide, you have installed the CLI and in this tutorial, you are going to use it to work with Kubernetes on OpenStack Magnum. + +No. 7 **Autohealing of Kubernetes Clusters** + +To learn more about autohealing of Kubernetes clusters, follow this official article [What is Magnum Autohealer?](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/magnum-auto-healer/using-magnum-auto-healer.md). + +The Advantages of Using the CLI[](#the-advantages-of-using-the-cli "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +You can use the CLI and Horizon interface interchangeably, but there are at least three advantages in using CLI. + +### Reproduce Commands Through Cut & Paste[](#reproduce-commands-through-cut-paste "Permalink to this headline") + +Here is a command to list flavors in the system + +``` +openstack flavor list + +``` + +![flavors_list.png](../_images/flavors_list.png) + +If you have this line stored in text editor app, you can reproduce it at will. In contrast, to get the list of flavors using Horizon, you would have to click on a series of screen buttons + +> **Compute** => **Instances** => **Launch instance** => **Flavor** + +and only then get the list of flavors to choose from: + +![horizon_flavors.png](../_images/horizon_flavors.png) + +A bonus is that keeping commands in a text editor automatically creates documentation for the server and cluster. + +### CLI Commands Can Be Automated[](#cli-commands-can-be-automated "Permalink to this headline") + +You can use available automation. The result of the following Ubuntu pipeline is the url for communication from **kubectl** to the Kubernetes cluster: + +![kubernetes_url.png](../_images/kubernetes_url.png) + +There are two commands pipelined into one: + +``` +KUBERNETES_URL=$(openstack coe cluster show k8s-cluster + | awk '/ api_address /{print $4}') + +``` + +The result of the first command + +``` +openstack coe cluster show k8s-cluster + +``` + +is a series of lines starting with the name of the parameter and followed by the actual value. + +![api_address.png](../_images/api_address.png) + +The second statement, to the right of the pipelining symbol **|** + +``` +awk '/ api_address /{print $4}') + +``` + +is searching for the line starting with *api\_address* and extracting its value *https://64.225.132.135:6443*. The final result is exported to the system variable KUBERNETES\_URL, thus automatically setting it up for use by Kubernetes cluster command **kubectl** when accessing the cloud. + +### CLI Yields Access to All of the Existing OpenStack and Magnum Parameters[](#cli-yields-access-to-all-of-the-existing-openstack-and-magnum-parameters "Permalink to this headline") + +CLI commands offer access to a larger set of parameters than is available through Horizon. For instance, in Horizon, the default length of time allowed for creation of a cluster is 60 minutes while in CLI, you can set it to other values of choice. + +### Debugging OpenStack and Magnum Commands[](#debugging-openstack-and-magnum-commands "Permalink to this headline") + +To see what is actually happening behind the scenes, when executing client commands, add parameter **–debug**: + +``` +openstack coe cluster list --debug + +``` + +The output will be several screens long, consisting of GET and POST web calls, with dozens of parameters shown on screen. (The output is too voluminous to reproduce here.) + +How to Enter OpenStack Commands[](#how-to-enter-openstack-commands "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Note + +In the forthcoming example, a version **fedora-coreos-34.20210904.3.0** of fedora images is used. As the system is updated in time, the actual values may become different, for instance, any of values **fedora-coreos-35** or **fedora-coreos-33.20210426.3.0**. Use Horizon command Compute -> Images to see what images of fedora are currently available, then edit and replace as needed. + +There are several ways to write down and enter Openstack commands into the terminal command line interface. + +One way is to enter command **openstack** and press *Enter* on the keyboard. You enter the line mode of the **openstack** command and can enter rows of various openstack parameters line after line. This is stricly for manual data entry and is difficult to automate. + +![ku_openstack_line_entry.png](../_images/ku_openstack_line_entry.png) + +Type **quit** and press *Enter* on keyboard to leave that mode. + +The usual way of entering **openstack** parameters is in one long line. Leave spaces between parameters but enter label values *without* any spaces inbetween. An example may be: + +![ku_long_line.png](../_images/ku_long_line.png) + +The line breaks and blanks have to be eradicated manually in this case. + +A more elegant way is to use backslash character, **\**, in line text. The character after backslash will not be taken into account so if you enter it at the very end of the line, the EOL character will be avoided and the first and the second line will be treated as one continuous line. That is exactly what you want, so here is what an entry line could look like with this approach: + +``` +openstack coe cluster template create kubecluster \ +--image "fedora-coreos-34.20210904.3.0" \ +--external-network external \ +--master-flavor eo1.large \ +--flavor eo1.large \ +--docker-volume-size 50 \ +--network-driver calico \ +--docker-storage-driver overlay2 \ +--master-lb-enabled \ +--volume-driver cinder \ +--labels boot_volume_type=,boot_volume_size=50,kube_tag=v1.18.2,availability_zone=nova \ +--coe kubernetes -f value -c uuid + +``` + +The end of each line is precented by a backslash and so all these lines appear as one (long) line to terminal command line scanner. However, when copying and pasting this to the terminal line, beware of the following situation: + +![ku_blanks.png](../_images/ku_blanks.png) + +If the blanks are present at the beginning of each line, that will be a problem. Eliminate them by going into any text editor and then removing them either manually or through replace function. What you need to have in text editor is this: + +![ku_no_blanks.png](../_images/ku_no_blanks.png) + +Now you can copy it and paste into the terminal command line: + +![ku_blanks_ok.png](../_images/ku_blanks_ok.png) + +You notice that the line with **labels** can become long and its right part may not be visible on screen. Use **\** and new line to break the long **–labels** line into several shorter ones: + +![ku_labels_broken.png](../_images/ku_labels_broken.png) + +Pressing *Enter* on the keyboard activates this entire command and it is accepted by the system as you can see in the line below the command. + +Warning + +If you are new to Kubernetes please, at first, create clusters only directly using the default cluster template. +Once you get more experience, you can start creating your own cluster templates and here is how to do it using CLI. + +OpenStack Command for Creation of Cluster[](#openstack-command-for-creation-of-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------- + +In this step you can create a new cluster using either the default cluster template or any of the templates that you have already created. + +Enter + +``` +openstack coe cluster create -h + +``` + +to see the parameters. Provide all or almost all of the required parameters. + +``` +usage: openstack coe cluster create +[-h] +--cluster-template +[--discovery-url ] +[--docker-volume-size ] +[--labels ] +[--keypair ] +[--master-count ] +[--node-count ] +[--timeout ] +[--master-flavor ] +[--flavor ] + + +``` + +Here is what one such command might actually look like: + +``` +openstack coe cluster create + --cluster-template k8s-stable-1.23.5 + --docker-volume-size 50 + --labels eodata_access_enabled=false,floating-ip-enabled=true, + --merge-labels + --keypair sshkey + --master-count 3 + --node-count 2 + --timeout 190 + --master-flavor eo1.large + --flavor eo1.large + newcluster + +``` + +Warning + +When using the exemplar default cluster template, *k8s-stable-1.23.5*, there is no need to specify label **master-lb-enabled=true** as the master load balancer will always be created with the default cluster template. The only way to **not** have master load balancer created with the default template is to specify flag **–master-lb-disabled**. Again, using **master-lb-enabled=false** with **–merge-labels** applied afterwards, also will **not** work, i.e. will not prevent master LB from being created. + +Here are some special labels the functionality of which is only available through CLI and not through Horizon as well. + +**How to properly form a cluster with auto healing turned on** + +Note + +**Prerequisite No. 6** will show you how to enable command line interface with your cloud server. **Prerequisite No. 7** will give you a formal introduction to the notion of Kubernetes autohealing, as implemented in OpenStack Magnum. + +The only way to have auto healing turned on and guarantee at the same time that the cluster will be formed normally, is to set up the following label: + +``` +auto_healing_enabled=True + +``` + +Warning + +Do not include the above label if you want to create a cluster that does not use auto healing. + +Here is a variation of the CLI command to generate a cluster. It will use medium values instead of large for flavors, will have only one master and one worker node, will have auto healing turned on etc. + +**openstack coe cluster create –cluster-template k8s-stable-1.23.5 –labels floating-ip-enabled=true,master-lb-enabled=true,auto\_healing\_enabled=true –merge-labels –keypair sshkey –master-count 1 –node-count 1 –master-flavor eo1.medium –flavor eo1.medium newcluster** + +**Execute the command for creation of a cluster** + +Copy and paste the above command into the terminal where OpenStack and Magnum clients are active: + +![cli_newcluster.png](../_images/cli_newcluster.png) + +How To Check Upon the Status of the Cluster[](#how-to-check-upon-the-status-of-the-cluster "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +The command to show the status of clusters is + +``` +openstack coe cluster list + +``` + +*newcluster* is in status of CREATE\_IN\_PROGRESS i.e. it is being created under the hood. Repeat the command after a minute or two and see the latest status, which now is CREATE\_FAILED. To see the reason why the creation of the cluster stopped, go to the Horizon interface, list the clusters and click on the name of *newcluster*. + +Under **Stack**, there is a message like this: + +``` +Resource CREATE failed: OverQuotaClient: resources.secgroup_kube_master: Quota exceeded for resources: +['security_group_rule']. Neutron server returns request_ids: ['req-1aff5045-db64-4075-81df-80611db8cb6c'] + +``` + +The quota for the security group rules was exceeded. To verify, execute this command: + +``` +openstack quota show --default + +``` + +The result may be too cluttered in a normal terminal window, so in this case, more information will be available from the Horizon interface: + +![overview.png](../_images/overview.png) + +Red and orange colors denote danger and you either have to ask support to double your quotas or delete the instances and clusters that have exceeded them. + +Note + +It is out of scope of this article to describe how to delete elements through Horizon interface. Make sure that quotas are available before new cluster creation. + +Failure to Create a Cluster[](#failure-to-create-a-cluster "Permalink to this headline") +----------------------------------------------------------------------------------------- + +There are many reasons why a cluster may fail to create. Maybe the state of system quotas is not optimal, maybe there is a mismatch between the parameters of the cluster and the parameters in the rest of the cloud. For example, if you base the creation of cluster on the default cluster template, it will use Fedora distribution and require 10 GiB of memory. It may clash with *–docker-volume-size* if that was set up to be larger then 10 GiB. + +The flavors for master and minions are *eo1.large*, and if you want a larger Docker image size, increase the *–master-flavor* size. + +The entire cloud may be overloaded and the creation of cluster may take longer than the default 60 minutes. Set up the *–timeout* parameter to 120 or 180 minutes in such cases. + +If the creation process failed prematurely, then + +> * review system quotas +> * delete the failed cluster(s) +> * review system quotas again +> * change parameters and +> * run the cluster creation command again. + +CLI Commands to Delete a Cluster[](#cli-commands-to-delete-a-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +If the cluster failed to create, it is still taking up system resources. Delete it with command such as + +``` +openstack coe cluster delete + +``` + +List the clusters and you will first see that the status is DELETE\_IN\_PROGRESS and, after a while, the *newcluster* will disappear. + +Now try to delete cluster *largecluster*. There are two of them, so putting up a command such as + +``` +openstack coe cluster delete largecluster + +``` + +will not be accepted. Instead of the name, enter the *uuid* value: + +``` +openstack coe cluster delete e80c5815-d20b-4a2b-8588-49cf7a7e1aad + +``` + +Again, the request will be accepted and then after a minute or two, the required cluster will disappear. + +Now there is only one *largecluster* so this will work: + +``` +openstack coe cluster delete largecluster + +``` + +Deleting clusters that were not installed properly has freed up a significant amount of system resources. There are no more orange and red quotas: + +![after_delete_cluster.png](../_images/after_delete_cluster.png) + +In this step you have successfuly deleted the clusters whose creation has stopped prematurely, thus paving the way to the creation of the next cluster under slightly different circumstances. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +In this tutorial, you have used the CLI commands to generate cluster templates as well as clusters themselves. Also, if the cluster process failed, how to free up the system resources and try again. + +OpenStack and Magnum did heavy lifting for you, letting you create full fledged Kubernetes clusters with only a handful of CLI commands. The next step is to start working with the Kubernetes clusters directly. That means installing the **kubectl** command with article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) and using it to install the apps that you want to run on Kubernetes clusters. \ No newline at end of file diff --git a/docs/kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..733dcd6 --- /dev/null +++ b/docs/kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,257 @@ +How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum[](#how-to-create-a-kubernetes-cluster-using-brand-name-openstack-magnum "Permalink to this headline") +================================================================================================================================================================================= + +In this tutorial, you will start with an empty Horizon screen and end up running a full Kubernetes cluster. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating a new Kubernetes cluster using one of the default cluster templates +> * Visual interpretation of created networks and Kubernetes cluster nodes + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +The resources that you require and use will reflect on the state of your account wallet. Check your account statistics at and if you are not going to use the cluster any more, remove them altogether to save resources costs. + +Magnum clusters created by certain users are bound together with an impersonation token and in the event of removing that user from the project, the cluster will lose authentication to Openstack API making cluster non-operational. A typical scenario would be for the tenant manager to create user accounts and let them create Kubernetes clusters. Later on, in this scenario, when the cluster is operational, the user would be removed from the project. The cluster would be present but the user could not, say, create new clusters, or persistent volume claims would be dysfunctional and so on. + +Therefore, good practice in creation of new Kubernetes clusters is to create a service account dedicated to creating a Magnum cluster. In essence, devote one account to one Kubernetes cluster, nothing more and nothing less. + +No. 2 **Private and public keys** + +An SSH key-pair created in OpenStack dashboard. To create it, follow this article [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +The key pair created in that article is called “sshkey”. You will use it as one of the parameters for creation of the Kubernetes cluster. + +Step 1 Create New Cluster Screen[](#step-1-create-new-cluster-screen "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Click on **Container Infra** and then on **Clusters**. + +![clusters_command.png](../_images/clusters_command.png) + +There are no clusters yet so click on button **+ Create Cluster** on the right side of the screen. + +![create_new_cluster.png](../_images/create_new_cluster.png) + +On the left side and in blue color are the main options – screens into which you will enter data for the cluster. The three with the asterisks, **Details**, **Size**, and **Network** are mandatory; you must visit them and either enter new values or confirm the offered default values within each screen. When all the values are entered, the **Submit** button in the lower right corner will become active. + +**Cluster Name** + +This is your first cluster, name it just *Kubernetes*. + +![cluster_name_filled_in.png](../_images/cluster_name_filled_in.png) + +Cluster name cannot contain spaces. Using a name such as *XYZ k8s Production* will result in an error message, while a name such as *XYZ-k8s-Production* won’t. + +**Cluster Template** + +Cluster template is a blueprint for base configuration of the cluster, where the version number reflects the Kubernetes version used. + +You immediately see how the cluster template is applied: + +![cluster_template_detail2.png](../_images/cluster_template_detail2.png) + +**Availability Zone** + +**nova** is the name of the related module in OpenStack and is the only option offered here. + +**Keypair** + +Assuming you have used **Prerequisite No. 2**, choose *sshkey*. + +![white_keypair_select.png](../_images/white_keypair_select.png) + +**Addon Software - Enable Access to EO Data** + +This field is specific to OpenStack systems that are developed by [Cloudferro hosting company](https://cloudferro.com/en/). *EODATA* here means **Earth Observation Data** and refers to data gained from scientific satelites monitoring the Earth. + +Checking this field on, will install a network which will have access to the downloaded satelite data. + +If you are just trying to learn about Kubernetes on OpenStack, leave this option unchecked. And vice versa: if you want to go into production and use satellite data, turn it on. + +Note + +There is cluster template label called **eodata\_access\_enabled=true** which – if turned on – will have the same effect of creating a network for connecting to the EODATA. + +This is what the screen looks like when all the data have been entered: + +![create_new_cluster_filled_in2.png](../_images/create_new_cluster_filled_in2.png) + +Click on lower right button **Next** or on option **Size** from the left main menu of the screen to proceed to the next step of defining a Kubernetes cluster. + +Step 2 Define Master and Worker Nodes[](#step-2-define-master-and-worker-nodes "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +In general terms, *master nodes* are used to host the internal infrastructure of the cluster, while the *worker nodes* are used to host the K8s applications. + +This is how this window looks before entering the data: + +![cluster_size_new.png](../_images/cluster_size_new.png) + +If there are any fields with default values, such as **Flavor of Master Nodes** and **Flavor of Worker Nodes**, these values were predefined in the cluster template. + +**Number of Master Nodes** + +![number_of_master_nodes_filled_in.png](../_images/number_of_master_nodes_filled_in.png) + +Kubernetes cluster has *master* and *worker* nodes. In real applications, a typical setup would be running 3 master nodes to ensure High Availability of the cluster’s infrastructure. Here, you want to create your first cluster in a new environment so settle for just **1** master node. + +**Flavor of Master Nodes** + +![flavor2_master2.png](../_images/flavor2_master2.png) + +Select **eo1.large** for master node flavor. + +**Number of Worker Nodes** + +![worker_nodes_number.png](../_images/worker_nodes_number.png) + +Enter **3**. This is for introductory purposes only, in real life the cluster can consist of multiple worker nodes. The cluster sizing guidelines are beyond the scope of this article. + +**Flavor of Worker Nodes** + +Again, choose **eo1.large**. + +**Auto Scaling** + +![auto_scaling_filled_in.png](../_images/auto_scaling_filled_in.png) + +When there is lot of demand for workers’ services, the Kubernetes system can scale to using more worker nodes. Our sample setting is minimum 2 and maximum 4 master nodes. With this setting the number of nodes will be dynamically adjusted between these values, based on the ongoing load (number and resource requests of pods running K8S applications on the cluster). + +Here is what the screen **Size** looks like when all the data are entered: + +![size_screen_filled.png](../_images/size_screen_filled.png) + +To proceed, click on lower right button **Next** or on option **Network** from the left main menu. + +Step 3 Defining Network and LoadBalancer[](#step-3-defining-network-and-loadbalancer "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +This is the last of mandatory screens and the blue **Submit** button in the lower right corner is now active. (If it is not, use screen button **Back** to fix values in previous screens.) + +![network_option.png](../_images/network_option.png) + +**Enable Load Balancer for Master Nodes** + +This option will be automatically checked, when you selected more than one master node. Using multiple master nodes ensures High Availability of the cluster infrastructure, and in such case the Load Balancer will be then necessary to distribute the traffic between masters. + +If you selected only one master node, which might be relevant in non-production scenarios e.g. testing, you will still have an option to either add or skip the Load Balancer. Note that using a LoadBalancer with one master node is still a relevant option, as this option will allow to access the cluster from outside of the cluster network. With no such option selected you will need to rely on SSH access to the master. + +**Create New Network** + +This box comes **turned on**, meaning that the system will create a network just for this cluster. Since Kubernetes clusters need subnets for inter-communications, a related subnetwork will be firstly created and then used further down the road. + +It is strongly recommended to use automatic creation of network when creating a new cluster. + +However, turning the checkbox off discloses an option to use an existing network as well. + +**Use an Existing Network** + +Using an existing network is a more advanced option. You would need to first create a network dedicated to this cluster in OpenStack along with the necessary adjustments. Creation of such a custom network is beyond the scope of this article. Note you should not use the network of another cluster, project network or EODATA network. + +If you have an existing network and you would like to proceed, you will need to choose the network and the subnet from the dropdown below: + +![use_an_existing_network.png](../_images/use_an_existing_network.png) + +Both fields have an asterisk behind them, meaning you must specify a concrete value in each of the two fields. + +**Cluster API** + +The setting of “Available on public internet” implies that floating IPs will be assigned to both master and worker nodes. This option is usually redundant and has security concerns. Unless you have a specific requirement, leave this option on “private” setting. Then you can always assign floating IPs to required nodes from the “Compute” section in Horizon. + +**Ingress Controller** + +Use of ingress is a more advanced feature, related to load balancing the traffic to the Kubernetes applications. + +If you are just starting with Kubernetes, you will rather not require this feature immediately, so you could leave this option out. + +Step 4 Advanced options[](#step-4-advanced-options "Permalink to this headline") +--------------------------------------------------------------------------------- + +**Option Management** + +![management.png](../_images/management.png) + +There is just one option in this window, **Auto Healing** and its field **Automatically Repair Unhealthy Nodes**. + +*Node* is a basic unit of Kubernetes cluster and the Kubernetes systems software will automatically poll the state of each cluster; if not ready or not available, the system will replace the unhealthy node with a healthy one – provided, of course, that this field is checked on. + +If this is your first time trying out the formation of Kubernetes clusters, auto healing may not be of interest to you. In production, however, auto healing should always be on. + +**Option Advanced** + +![advanced_option.png](../_images/advanced_option.png) + +Option **Advanced** allows for entering of so-called *labels*, which are named parameters for the Kubernetes system. Normally, you don’t have to enter anything here. + +Labels can change how the cluster creation is performed. There is a set of labels, called the *Template and Workflow Labels*, that the system sets up by default. If this check box is left as is, that is, unchecked, the default labels will be used unchanged. That guarantees that the cluster will be formed with all of the essential parameters in order. Even if you add your own labels, as shown in the image above, everything will still function. + +If you **turn on** the field **I do want to override Template and Workflow Labels** and if you use any of the *Template and Workflow Labels* by name, they will be set up the way you specified. Use this option very rarely, if at all, and only if you are sure of what you are doing. + +Step 5 Forming of the Cluster[](#step-5-forming-of-the-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Once you click on **Submit** button, OpenStack will start creating the Kubernetes cluster for you. It will show a cloud message with green background in the upper right corner of the windows, stating that the creation of the cluster has been started. + +Cluster generation usually takes from 10 to 15 minutes. It will be automatically abandoned if duration time is longer than 60 minutes. + +If there is any problem with creation of the cluster, the system will signal it in various ways. You may see a message in the upper right corner, with a red background, like this: + +![unable_to_create_a_cluster.png](../_images/unable_to_create_a_cluster.png) + +Just repeat the process and in most cases you will proceed to the following screen: + +![cluster_forming.png](../_images/cluster_forming.png) + +Click on the name of the cluster, *Kubernetes*, and see what it will look like if everything went well. + +![creation_in_progress2.png](../_images/creation_in_progress2.png) + +Step 6 Review cluster state[](#step-6-review-cluster-state "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Here is what OpenStack Magnum created for you as the result of filling in the data in those three screens: + +> * A new network called *Kubernetes*, complete with subnet, ready to connect further. +> * New instances – virtual machines that serve as nodes. +> * A new external router. +> * New security groups, and of course +> * A fully functioning Kubernetes cluster on top of all these other elements. + +You can observe that the number of nodes in the cluster was initially 3, but after a while the cluster auto-scaled itself to 2. This is expected and is the result of autoscaler, which detected that our cluster is mostly still idle in terms of application load. + +There is another way which we can view our cluster setup and inspect any deviations from required state. Click on **Network** in the main menu and then on **Network Topology**. You will see a real time graphical representation of the network. As soon as the one of the cluster elements is added, it will be shown on screen. + +![network_topology_with_labels.png](../_images/network_topology_with_labels.png) + +Also in the Horizon’s “Compute” panel you can see the virtual machines which were created for master and worker nodes: + +![new_instances2.png](../_images/new_instances2.png) + +Node names start with *kubernetes* because that is the name of the cluster in lower case. + +Resources tied up from one attempt of creating a cluster are **not** automatically reclaimed when you again attempt to create a new cluster. Therefore, several attempts in a row will lead to a stalemate situation, in which no cluster will be formed until all of the tied up resources are freed up. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You now have a fully operational Kubernetes cluster. You can + +* use ready-made Docker images to automate installation of apps, +* activate the Kubernetes dashboard and watch the state of the cluster online + +and so on. + +Here are some relevant articles: + +Read more about ingress here: [Using Kubernetes Ingress on CloudFerro Cloud OpenStack Magnum](Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html) + +Article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) shows how to use command line interface to create Kubernetes clusters. + +To access your newly created cluster from command line, see article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). \ No newline at end of file diff --git a/docs/kubernetes/How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html.md b/docs/kubernetes/How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..fedd5cb --- /dev/null +++ b/docs/kubernetes/How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html.md @@ -0,0 +1,180 @@ +How to create Kubernetes cluster using Terraform on CloudFerro Cloud[](#how-to-create-kubernetes-cluster-using-terraform-on-brand-name "Permalink to this headline") +===================================================================================================================================================================== + +In this article we demonstrate using [Terraform](https://www.terraform.io/) to deploy an OpenStack Magnum Kubernetes cluster on CloudFerro Cloud cloud. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting account** + +You need an active CloudFerro Cloud account . + +No. 2 **Active CLI session with OpenStackClient for Linux** + +You need an OpenStack CLI installed and the respective Python virtual environment sourced. For guidelines see: + +[How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) + +It will show you how to install Python, create and activate a virtual environment, and then connect to the cloud by downloading and activating the proper RC file from the CloudFerro Cloud cloud. + +No. 3 **Connect to the cloud via an RC file** + +Another article, [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html), deals with connecting to the cloud and is covering either of the one- or two-factor authentication procedures that are enabled on your account. It also covers all the main platforms: Linux, MacOS and Windows. + +You will use both the Python virtual environment and the downloaded RC file **after** Terraform has been installed. + +No. 4 **Familiarity with creating Kubernetes clusters** + +Familiarity with creating Kubernetes clusters in a standard way e.g. using Horizon or OpenStack CLI: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +[How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 5 **Terraform operational** + +Have Terraform installed locally or on a cloud VM - installation guidelines along with further information can be found in this article: + +[Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud](../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html) + +After you finish working through that article, you will have access to the cloud via an active **openstack** command. Also, special environmental (**env**) variables (**OS\_USERNAME**, **OS\_PASSWORD**, **OS\_AUTH\_URL** and others) will be set up so that various programs can use them – Terraform being the prime target here. + +Define provider for Terraform[](#define-provider-for-terraform "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Terraform uses the notion of *provider*, which represents your concrete cloud environment and covers authentication. CloudFerro Cloud clouds are built complying with OpenStack technology and OpenStack is one of the standard types of providers for Terraform. + +We need to: + +> * instruct Terraform to use OpenStack as a provider type +> * provide credentials which will to point to our own project and user in the cloud. + +Assuming you have worked through Prerequisite No. 2 (download and source the RC file), several OpenStack-related environment variables will be populated in your local system. The ones pointing to your OpenStack environment start with OS, e.g. **OS\_USERNAME**, **OS\_PASSWORD**, **OS\_AUTH\_URL**. When we define OpenStack as TerraForm provider type, Terraform will know to automatically use these **env** variables to authenticate. + +Let’s define the Terraform provider now by creating file **provider.tf** with the following contents: + +> **provider.tf** + +``` +# Define providers +terraform { +required_version = ">= 0.14.0" + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "~> 1.35.0" + } + } +} + +# Configure the OpenStack Provider +provider "openstack" { + auth_url = "https://keystone.cloudferro.com:5000/v3" + # the rest of configuration parameters are taken from environment variables once RC file is correctly sourced +} + +``` + +The **auth\_url** is the only configuration option that shall be provided in the configuration file, despite it also being available within the environment variables. + +Having this provider spec allows us to create a cluster in the following steps, but can also be reused to create other resources in your OpenStack environment e.g. virtual machines, volumes and many others. + +Define cluster resource in Terraform[](#define-cluster-resource-in-terraform "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +The second step is to define the exact specification of a resource that we want to create with Terraform. In our case we want to create a OpenStack Magnum cluster. In Terraform terminology, it will be an instance of **openstack\_containerinfra\_cluster\_v1** resource type. To proceed, create file **cluster.tf** which contains the specification of our cluster: + +**cluster.tf** + +``` +# Create resource +resource "openstack_containerinfra_cluster_v1" "k8s-cluster" { + name = "k8s-cluster" + cluster_template_id = "524535ed-9a0f-4b70-966f-6830cdc52604" + node_count = 3 + master_count = 3 + flavor = "eo1.large" + master_flavor = "hmad.medium" + keypair = "mykeypair" + labels = { + eodata_access_enabled = true + etcd_volume_size = 0 + } + merge_labels = true +} + +``` + +The above setup reflects a cluster with some frequently used customizations: + +cluster\_template\_id +: corresponds to the ID of one of default cluster templates in WAW3-2 cloud, which is **k8s-localstorage-1.23.16-v1.0.0**. The default templates and their IDs can be looked up in Horizon UI interface in the submenu **Cluster Infra** -→ **Container Templates**. + +node\_count, node\_flavor, master\_node\_count, master\_node\_flavor +: correspond intuitively to **count** and **flavor** of master and worker nodes in the cluster. + +keypair +: reflects the name of keypair used in our openstack project in the chosen cloud + +labels and merge\_labels +: We use two labels: + + eodata\_access\_enabled=true + : ensures that EODATA network with fast access to satellite images is connected to our cluster nodes, + + etcd\_volume\_size=0 + : which ensures that master nodes are properly provisioned with NVME local storage. + + With this configuration, it is mandatory to also use configuration **merge\_labels=true** to properly apply these labels and avoid overwriting them by template defaults. + +In our example we operate on WAW3-2 cloud, where flavor **hmad.medium** is available. If using another cloud, adjust the parameters accordingly. + +The above configuration reflects a cluster where *loadbalancer* is placed in front of the master nodes, and where this loadbalancer’s flavor is **HA-large**. Customizing this default, similarly as with other more advanced defaults, would require creating a custom Magnum template, which is beyond the scope of this article. + +Apply the configurations and create the cluster[](#apply-the-configurations-and-create-the-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +Once both Terraform configurations described in previous steps are defined, we can apply them to create our cluster. + +The first step is to have both files **provider.tf** and **cluster.tf** available in a dedicated folder. Then **cd** to this folder and type: + +``` +terraform init + +``` + +This command will initialize our cluster deployment. It will capture any formal errors with authentication to OpenStack, which might need correcting before moving to the next stage. + +![image-2024-6-17_15-52-40.png](../_images/image-2024-6-17_15-52-40.png) + +As the next step, Terraform will plan the actions it needs to perform to create the resource. Proceed with typing: + +``` +terraform plan + +``` + +The result is shown below and gives a chance to correct any logical errors to our expected setup: + +![image-2024-6-18_17-32-8.png](../_images/image-2024-6-18_17-32-8.png) + +The last step is to apply the planned changes. Perform this step with the command: + +``` +terraform apply + +``` + +The output of this last command will initially repeat the plan, then ask to enter word **yes** to set the Terraform into action. + +Upon confirming with **yes**, the action is deployed and the console will update every 10 seconds to give a “Still creating …” check until our cluster is created. + +The final lines of the output after successfully provisioning the cluster, should read similar to the below: + +![image-2024-6-18_18-1-53.png](../_images/image-2024-6-18_18-1-53.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Terraform can be used also to deploy additional applications to our cluster e.g. using Helm provider for Terraform. Check Terraform documentation for more details. \ No newline at end of file diff --git a/docs/kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html.md b/docs/kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html.md new file mode 100644 index 0000000..2c83f3c --- /dev/null +++ b/docs/kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html.md @@ -0,0 +1,389 @@ +How to install Rancher RKE2 Kubernetes on CloudFerro Cloud[](#how-to-install-rancher-rke2-kubernetes-on-brand-name "Permalink to this headline") +================================================================================================================================================= + +[RKE2](https://docs.rke2.io/) - Rancher Kubernetes Engine version 2 - is a Kubernetes distribution provided by SUSE. Running a self-managed RKE2 cluster in CloudFerro Cloud cloud is a viable option, especially for those seeking smooth integration with Rancher platform and customization options. + +An RKE2 cluster can be provisioned from Rancher GUI. However, in this article we use Terraform, which enables streamlined, automated cluster creation. We also use OpenStack Cloud Controller Manager (CCM) to integrate RKE2 cluster with the wider OpenStack environment. Using the customized version of CCM enables us to take advantage of CloudFerro Cloud cloud-native features. The end result is + +> * a provisioned RKE2 cluster +> * running under OpenStack, with +> * an integrated OpenStack Cloud Controller Manager. + +We also illustrate the coding techniques used, in case you want to enhance the RKE2 implementation further. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Perform the preliminary setup +> +> > * Create new project +> > * Create application credentials +> > * Have keypair operational +> > * Authenticate to the newly formed project +> +> * Use Terraform configuration for RKE2 from CloudFerro’s GitHub repository +> * Provision an RKE2 cluster +> * Demonstrate the incorporated cloud-native load-balancing +> * Implementation details +> * Further customization + +The code is tested on Ubuntu 22.04. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Terraform available on your local command line** + +See [Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud](../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html) + +No. 3 **Python virtual environment sourced** + +[How to install Python virtualenv or virtualenvwrapper on CloudFerro Cloud](../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html) + +No. 4 **OpenStack CLI installed locally** + +When installed, you will have access to **openstack** command and will be able to communicate with the OpenStack cloud: + +[How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html) + +No. 5 **kubectl tool installed locally** + +Standard types of **kubectl** installation are described on [Install Tools page](https://kubernetes.io/docs/tasks/tools/) of the official Kubernetes site. + +No. 6 **Available key pair in OpenStack** + +[How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). + +No. 7 **Application credentials** + +The following article describes how to create and use application credentials, using CLI: + +[How to generate or use Application Credentials via CLI on CloudFerro Cloud](../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html) + +In this article, we shall create application credentials through Horizon but with a specific selection of user roles. + +No. 8 **Projects, roles, users and groups** + +Option **Identity** lists available projects, roles, users and groups. See [What is an OpenStack project on CloudFerro Cloud](../cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html) + +No. 9 **Experience with Kubernetes and Helm** + +To follow up on this article, you should know your way around Kubernetes in general. Having the actual experience of using it on CloudFerro Cloud cloud, would be even better. For a series of article on Kubernetes, see [KUBERNETES](kubernetes.html). + +To perform the installation required in this article, one of the steps will be to create Helm CRD and use it. This article shows the basics of using Helm [Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html). + +No. 10 **Cloud Controller Manager** + +Within a general Kubernetes environment, [the Cloud Controller Manager (CCM)](https://kubernetes.io/docs/concepts/architecture/cloud-controller/) allows Kubernetes to integrate with cloud provider APIs. It abstracts cloud-specific logic and manages and synchronizes resources between Kubernetes and the underlying cloud infrastructure. Also, it provides controllers for Nodes, Routes, Services and Volumes. + +Under OpenStack, CCM integrates with OpenStack APIs. The code used here is from a concrete repository for Cloud Controller Manager – It implements the above mentioned (as well as) other OpenStack-Kubernetes integrations. + +No. 11 **rke2-terraform repository** + +You will need to download the following repository + +> + +in order to install install Terraform manifests for provisioning of RKE2 on CloudFerro Cloud using Terraform. + +No. 12 **Customize the cloud configuration for Terraform** + +One of the files downloaded from the above link will be **variables.tf**. It contains definitions of region, cluster name and many other variables. The default value for region is **WAW3-2** so customize it for your own cloud. + +![customize_the_cloud.png](../_images/customize_the_cloud.png) + +Step 1 Perform the preliminary setup[](#step-1-perform-the-preliminary-setup "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Our objective is to create a Kubernetes cluster, which runs in the cloud environment. RKE2 software packages will be installed on cloud virtual machines playing roles of Kubernetes master and worker nodes. Also, several other OpenStack resources will be created along. + +As part of the preliminary setup to provision these resources we will: + +> * Create a dedicated OpenStack project to isolate all resources dedicated to the cluster +> * Create application credentials +> * Ensure a key pair is enabled for the project +> * Source locally the RC file for this project + +We here provide the instruction to install the project, credentials, key pair and source locally the RC file. + +### Preparation step 1 Create new project[](#preparation-step-1-create-new-project "Permalink to this headline") + +First step is to create a new project use Horizon UI. Click on Identity → Projects. Fill in the name of the project on the first tab: + +![image-2024-7-29_9-56-44.png](../_images/image-2024-7-29_9-56-44.png) + +In the second tab, ensure that the user you operate with is added as a project member with: “member”, “load-balancer\_member” and “creator” roles. + +![image-2024-7-29_9-54-45.png](../_images/image-2024-7-29_9-54-45.png) + +Then click on “Create Project”. Once the project is created, switch to the context of this project from top left menu: + +![image-2024-7-23_16-5-28.png](../_images/image-2024-7-23_16-5-28.png) + +### Preparation step 2 Create application credentials[](#preparation-step-2-create-application-credentials "Permalink to this headline") + +The next step is to create an application credential that will be used to authenticate the OpenStack Cloud Controller Manager (used for automated load balancer provisioning). To create one, go to menu **Identity** → **Application Credentials**. Fill in the form as per the below example, passing all available roles (“member”, “load-balancer\_member”, “creator”, “reader”) roles to this credential. Set the expiry date to a date in the future. + +![image-2024-7-29_10-2-57.png](../_images/image-2024-7-29_10-2-57.png) + +After clicking on **Create Application Credential**, copy both application ID and credential secret in a safe place. The window will be only displayed once, so the best solution is to download files **openrc** and **clouds.yaml**, which will both contain the required values. + +![credentials_first_time.png](../_images/credentials_first_time.png) + +Prerequisite No. 7 contains a complete guide to application credentials. + +### Preparation step 3 Keypair operational[](#preparation-step-3-keypair-operational "Permalink to this headline") + +Before continuing, ensure you have a keypair available. If you already had a keypair in your main project, this keypair will be available also for the newly created project. If you do not have one yet, create it from the left menu **Project** → **Compute** → **Key Pairs**. For additional details, visit Prerequisite No. 6. + +### Preparation step 4 Authenticate to the newly formed project[](#preparation-step-4-authenticate-to-the-newly-formed-project "Permalink to this headline") + +Lastly, download the RC file corresponding to the new project from Horizon GUI, then source this file in your local Linux terminal. See Prerequisite No. 4. + +Step 2 Use Terraform configuration for RKE2 from CloudFerro’s GitHub repository[](#step-2-use-terraform-configuration-for-rke2-from-cloudferro-s-github-repository "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +We added folder **rke2-terraform** to CloudFerro’s [K8s-samples GitHub repository](https://github.com/CloudFerro/K8s-samples/tree/main/rke2-terraform), from Prerequisite No. 11. This project includes configuration files to provision an RKE2 cluster on CloudFerro clouds and can be used as a starter pack for further customizations to your specific requirements. + +![image-2024-7-26_12-36-54.png](../_images/image-2024-7-26_12-36-54.png) + +In this section, we briefly introduce this repository, explaining the content and purpose of the specific configuration files. These files are the actual commands to Terraform and are defined in its standard files, with the extension **.tf**. + +variables.tf +: Contains key variables that specify configuration of our cluster e.g. **number of worker nodes**, **cloud region** where the cluster will be placed, **name of the cluster**. Most of these variables have their default values set and you can modify these defaults directly in the file. The variables with no defaults (secret, sensitive data) should have their values provided separately, via the use of **tfvars** file, which is explained in the next section. + +providers.tf +: Used for declaring and configuring Terraform providers. In our case, we only use OpenStack provider, which is provisioning cloud resources that form the cluster. + +main.tf +: Contains declaration of resources to be created by Terraform. Several OpenStack resources are required to form a cluster e.g. a Network, Subnet, Router, Virtual Machines and others. Review the file for details and customize to your preference. + +security-groups.tf +: Contains declaration of security groups and security group rules used in OpenStack to open specific ports on virtual machines forming the cluster. Thus, the communication from selected sources gets enabled on each VM. Modify the file to customize. + +cloud-init-masters.yml.tpl +: and + +cloud-init-workers.yml.tpl +: These two are template files used to create *cloud-init* files, which in turn are used for bootstrapping the created virtual machines: + + > * ensuring certain packages are installed on these VMs, + > * creating and running scripts on them etc. + + The content of these templates gets populated based on the user-data section in virtual machine declarations in **main.conf**. + + One of the primary functions of each *cloud-init* file is to install rke2 on both master and worker nodes. + +Step 3 Provision an RKE2 cluster[](#step-3-provision-an-rke2-cluster "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Let’s provision an RKE2 Kubernetes cluster now. This will consist of the following steps: + +> * Clone the github repository +> * Adjust the defaults in **variables.tf** +> * Create file **terraform.tfvars**, with secrets +> * Initialize, plan and apply the Terraform configurations +> * Use the retrieved **kubeconfig** to access the cluster with **kubectl** + +The first step is to clone the github repository. We clone the entire repo but just leave the **rke2-terraform** folder with the below commands: + +``` +git clone https://github.com/CloudFerro/K8s-samples +mkdir ~/rke2-terraform +mv ~/K8s-samples/rke2-terraform/* ~/rke2-terraform +rm K8s-samples/ -rf +cd rke2-terraform + +``` + +As mentioned in Prerequisite No. 12, inspect and eventually change the value of the default settings in **variables.tf** e.g. change the name of the cluster, cloud region or virtual machine settings. + +In our case, we stick to the defaults. + +Note + +Highly available control plane is currently not covered by this repository. Also, setting number of master nodes to a value other than 1 is **not** supported. + +### Enter data in file terraform.tfvars[](#enter-data-in-file-terraform-tfvars "Permalink to this headline") + +The next step is to create file **terraform.tfvars**, with the following contents: + +``` +ssh_keypair_name = "your_ssh_keypair_name" +project_id = "your_project_id" +public_key = "your_public_key" +application_credential_id = "your_app_credential_id" +application_credential_secret = "your_app_credential_secret" + +``` + +Get ssh\_keypair\_name +: Choose one from the list shown after **Compute** -> **Key Pairs**. + +Get project\_id +: To get **project\_id**, the easiest way is to list all of the projects with **Identity** -> **Projects**, click on project name and read the **ID**. + +Get public\_key +: To get **public\_key**, execute **Compute** -> **Key Pairs** and click on the name of the keypair name you have entered for variable **ssh\_keypair\_name**. + +Get application\_credential\_id +: Get application credential **ID** from one of the files **openrc** or **clouds.yaml**. + +Get application\_credential\_secret +: The same, only for secret. + +### Run Terraform to provision RKE2 cluster[](#run-terraform-to-provision-rke2-cluster "Permalink to this headline") + +This completes the set up part. We can now run the standard Terraform commands - **init**, **plan** and **apply** - to create our RKE2 cluster. The commands should be executed in the order provided below. Type **yes** when required to reconfirm the steps planned by Terraform. + +``` +terraform init +terraform plan +terraform apply + +``` + +The provisioning will take a few minutes (apx. 5-10 minutes for a small cluster). Logs will be printed to console confirming creation of each resource. Here is a sample final output from the **terraform apply** command: + +![image-2024-7-24_13-56-3.png](../_images/image-2024-7-24_13-56-3.png) + +As a part of the provisioning process, the *kubeconfig* file **kubeconfig.yaml** will be copied to your local working directory. Export the environment variable pointing your local kubectl installation to this *kubeconfig* location (replace the path in the sample command below): + +``` +export KUBECONFIG=/path_to_your_kubeconfig_file/kubeconfig.yaml + +``` + +Then check whether the cluster is available with: + +``` +kubectl get nodes + +``` + +We can see that the cluster is provisioned correctly in our case, with both master and worker nodes being **Ready**: + +![image-2024-7-24_14-9-18.png](../_images/image-2024-7-24_14-9-18.png) + +Step 4 Demonstrate cloud-native integration covered by the repo[](#step-4-demonstrate-cloud-native-integration-covered-by-the-repo "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------- + +We can verify the automated provisioning of load balancers and public Floating IP by exposing a service of type LoadBalancer. The following **kubectl** commands will deploy and expose an **nginx** server in our RKE2 cluster’s default namespace: + +``` +kubectl create deployment nginx-deployment --image=nginx:latest +kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80 --target-port=80 + +``` + +It takes around 2-3 minutes for the FIP and LoadBalancer to be provisioned. When you run this command: + +``` +kubectl get services + +``` + +After this time, you should see the result similar to the one below, where EXTERNAL-IP got properly populated: + +![image-2024-7-24_15-20-4.png](../_images/image-2024-7-24_15-20-4.png) + +Similarly, you could verify the presence of the created load balancer in the Horizon interface via the left menu: **Project** → **Network** → **LoadBalancers** + +![image-2024-7-24_15-27-55.png](../_images/image-2024-7-24_15-27-55.png) + +and **Project** → **Network** → **Floating IPs**: + +![image-2024-7-24_15-29-17.png](../_images/image-2024-7-24_15-29-17.png) + +Ultimately, we can check the service is running as a public service in our browser with the assigned floating IP: + +![image-2024-7-24_15-30-26.png](../_images/image-2024-7-24_15-30-26.png) + +Implementation details[](#implementation-details "Permalink to this headline") +------------------------------------------------------------------------------- + +Explaining all of the techniques that went into production of RKE2 repository from Prerequisite No. 11 is out of scope of this article. However, here is an illustration of how at least one feature was implemented. + +Let us examine the **cloud-init-masters.yml.tpl** file, concretely, the part between line numbers 53 and 79: + +``` +- path: /var/lib/rancher/rke2/server/manifests/rke2-openstack-cloud-controller-manager.yaml + permissions: "0600" + owner: root:root + content: | + apiVersion: helm.cattle.io/v1 + kind: HelmChart + metadata: + name: openstack-cloud-controller-manager + namespace: kube-system + spec: + chart: openstack-cloud-controller-manager + repo: https://kubernetes.github.io/cloud-provider-openstack + targetNamespace: kube-system + bootstrap: True + valuesContent: |- + nodeSelector: + node-role.kubernetes.io/control-plane: "true" + cloudConfig: + global: + auth-url: https://keystone.cloudferro.com:5000 + application-credential-id: "${application_credential_id}" + application-credential-secret: "${application_credential_secret}" + region: ${region} + tenant-id: ${project_id} + loadBalancer: + floating-network-id: "${floating_network_id}" + subnet-id: ${subnet_id} + +``` + +It covers creating a yaml definition of a HelmChart CRD + +*rke2-openstack-cloud-controller-manager.yaml* + +in location + +**/var/lib/rancher/rke2/server/manifests/** + +on the master node. Upon cluster creation, RKE2 provisioner automatically captures this file and deploys a pod responsible for provisioning such load balancers. This can be verified by checking the pods in the *kube-system* namespace: + +``` +kubectl get pods -n kube-system + +``` + +One of the entries is the aforementioned pod: + +``` +NAME READY STATUS RESTARTS AGE +... +openstack-cloud-controller-manager-bz7zt 1/1 Running 1 (4h ago) 26h +... + +``` + +Further customization[](#further-customization "Permalink to this headline") +----------------------------------------------------------------------------- + +Depending on your use case, further customization to the provided sample repository will be required to tune the Terraform configurations to provision an RKE2 cluster. We suggest evaluating the following enhancements: + +> * Incorporate High Availability of the Control Plane +> * Integrate with CSI Cinder to enable automated provisioning of block storage with the Persistent Volume Claims (PVCs) +> * Integrate NVIDIA device plugin for enabling native integration of VMs with vGPUs. +> * Implement node autoscaler to complement the Kubernetes-native Horizontal Pod Autoscaler (HPA) +> * Implement affinity and anti-affinity rules for placement of worker and master nodes + +To implement these features, you would need to simultaneously adjust definitions for both Terraform and Kubernetes resources. Covering those steps is, therefore, outside of scope of this article. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +In this article, you have created a proper Kubernetes solution using RKE2 cluster as a foundation. + +You can also consider creating Kubernetes clusters using Magnum within OpenStack: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) \ No newline at end of file diff --git a/docs/kubernetes/Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..dfa4e32 --- /dev/null +++ b/docs/kubernetes/Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html.md @@ -0,0 +1,339 @@ +Implementing IP Whitelisting for Load Balancers with Security Groups on CloudFerro Cloud[](#implementing-ip-whitelisting-for-load-balancers-with-security-groups-on-brand-name "Permalink to this headline") +============================================================================================================================================================================================================= + +In this article we describe how to use commands in Horizon, CLI and Terraform to secure load balancers for Kubernetes clusters in OpenStack by implementing IP whitelisting. + +What Are We Going To Do[](#what-are-we-going-to-do "Permalink to this headline") +--------------------------------------------------------------------------------- + +Introduction[](#introduction "Permalink to this headline") +----------------------------------------------------------- + +Load balancers without proper restrictions are vulnerable to unauthorized access. By implementing IP whitelisting, only specified IP addresses are permitted to access the load balancer. You decide from which IP address it is possible to access the load balancers in particular and the Kubernetes cluster in general. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **List of IP addresses/ranges to whitelist** + +This is the list of IP addresses that you want the load balancer to be able to listen to. + +No. 3 **A preconfigured load balancer** + +In OpenStack, each time you create a Kubernetes cluster, the corresponding load balancers are created automatically. + +See article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **OpenStack command operational** + +This is a necessary for CLI procedures. + +This boils down to sourcing the proper RC file from Horizon. See [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 5 **Python Octavia Client** + +To operate Load Balancers with CLI, the Python Octavia Client (python-octaviaclient) is required. It is a command-line client for the OpenStack Load Balancing service. Install the load-balancer (Octavia) plugin with the following command from the Terminal window, on Ubuntu 22.04: + +``` +pip install python-octaviaclient + +``` + +Or, if you have virtualenvwrapper installed: + +``` +mkvirtualenv python-octaviaclient +pip install python-octaviaclient + +``` + +Depending on the environment, you might need to use variants such as python3, pip3 and so on. + +No. 6 **Terraform installed** + +You will need Terraform version 1.50 or higher to be operational. + +For complete introduction and installation of Terrafom on OpenStack see article [Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud](../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html) + +To use Terraform in this capacity, you will need to authenticate to the cloud using application credentials with **unrestricted** access. Check article [How to generate or use Application Credentials via CLI on CloudFerro Cloud](../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html) + +Horizon: Whitelisting Load Balancers[](#horizon-whitelisting-load-balancers "Permalink to this headline") +---------------------------------------------------------------------------------------------------------- + +We will whitelist load balancers by restricting the relevant ports in their security groups. In Horizon, use command **Network** –> **Load Balancers** to see the list of load balancers: + +![whitelisting_again-4v2.png](../_images/whitelisting_again-4v2.png) + +Let us use load balancer with the name starting with **gitlab**. There is no direct connect from load balancer to security groups, so we first have to identify an instance which corresponds to that load balancer. Use commands **Project** –> **Compute** –> **Instances** and search for instances containing **gitlab** in its name: + +![whitelisting_again-5v2.png](../_images/whitelisting_again-5v2.png) + +Edit the security groups of those instances – for each instance, go to the **Actions** menu and select **Edit Security Groups**. + +![whitelisting_again-7v2.png](../_images/whitelisting_again-7v2.png) + +Filter by **gitlab**: + +![whitelisting_again-8v2.png](../_images/whitelisting_again-8v2.png) + +Use commands **Project** –> **Network** –> **Security Groups** to list security groups with **gitlab** in its name: + +![whitelisting_again-9v2.png](../_images/whitelisting_again-9v2.png) + +Choose which one you are going to edit; alternatively, you can create a new security group. Anyways, be sure to enter the following data: + +> * **Direction**: Ingress +> * **Ether Type**: IPv4 +> * **Protocol**: TCP +> * **Port Range**: Specify the port range used by your load balancer. +> * **Remote IP Prefix**: Enter the IP address or CIDR to whitelist. + +Save and apply the changes. + +### Verification[](#verification "Permalink to this headline") + +To confirm the configuration: + +1. Go to the **Instances** section in Horizon. +2. View the security groups applied to the load balancers’ associated instances. +3. Ensure the newly added rule is visible. + +CLI: Whitelisting Load Balancers[](#cli-whitelisting-load-balancers "Permalink to this headline") +-------------------------------------------------------------------------------------------------- + +The OpenStack CLI provides a command-line method for implementing IP whitelisting. + +Be sure to work through Prerequisites Nos 4 and 5 in order to have **openstack** command fully operational. + +List the security groups associated with the load balancer: + +``` +openstack loadbalancer show + +``` + +Identify the pool associated with the load balancer: + +``` +openstack loadbalancer pool list + +``` + +Show details of the pool to list its members: + +``` +openstack loadbalancer pool show + +``` + +Note the IP addresses of the pool members and identify the instances hosting them. + +Create a security group for IP whitelisting: + +``` +openstack security group create + +``` + +Add rules to the security group: + +``` +openstack security group rule create \ +--ingress \ +--ethertype IPv4 \ +--protocol tcp \ +--dst-port \ +--remote-ip \ + + +``` + +Apply the security group to the instances hosting the pool members: + +``` +openstack server add security group + +``` + +### Verification[](#id1 "Permalink to this headline") + +Verify the applied security group rules: + +``` +openstack security group show + +``` + +Confirm the security group is attached to the appropriate instances: + +``` +openstack server show + +``` + +Terraform: Whitelisting Load Balancers[](#terraform-whitelisting-load-balancers "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------- + +Terraform is an Infrastructure as Code (IaC) tool that can automate the process of configuring IP whitelisting. + +Create a security group and whitelist rule in **main.tf**: + +``` +# main.tf + +# Security Group to Whitelist IPs +resource "openstack_networking_secgroup_v2" "whitelist_secgroup" { + name = "loadbalancer_whitelist" + description = "Security group for load balancer IP whitelisting" +} + +# Add Whitelist Rule for Specific IPs +resource "openstack_networking_secgroup_rule_v2" "allow_whitelist" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 80 # Replace with actual port range + port_range_max = 80 + remote_ip_prefix = "192.168.1.0/24" # Replace with actual CIDR + security_group_id = openstack_networking_secgroup_v2.whitelist_secgroup.id +} + +# Existing Instances Associated with Pool Members +resource "openstack_compute_instance_v2" "instances" { + count = 2 # Adjust to the number of pool member instances + name = "pool_member_${count.index + 1}" + flavor_id = "m1.small" # Replace with an appropriate flavor + image_id = "image-id" # Replace with a valid image ID + key_pair = "your-key-pair" + security_groups = [openstack_networking_secgroup_v2.whitelist_secgroup.name] + network { + uuid = "network-uuid" # Replace with the UUID of your network + } +} + +# Associate the Load Balancer with Security Group via Instances +resource "openstack_lb_loadbalancer_v2" "loadbalancer" { + name = "my_loadbalancer" + vip_subnet_id = "subnet-id" # Replace with the subnet ID + depends_on = [openstack_compute_instance_v2.instances] +} + +``` + +Initialize and apply the configuration: + +``` +terraform init +terraform apply + +``` + +**Verification** + +Use Terraform to review the applied state: + +``` +terraform show +openstack server show +openstack security group show + +``` + +State of Security: Before and after whitelisting the balancers[](#state-of-security-before-and-after-whitelisting-the-balancers "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Before implementing IP whitelisting, the load balancer accepts traffic from all sources. After completing the procedure: + +> * Only specified IPs can access the load balancer. +> * Unauthorized access attempts are denied. + +### Verification Tools[](#verification-tools "Permalink to this headline") + +Various tools can ensure the protection is installed and active: + +livez +: Kubernetes monitoring endpoint. + +nmap +: (free): For port scanning and access verification. + +curl +: (free): To confirm access control from specific IPs. + +Wireshark +: (free): For packet-level analysis. + +### Testing with nmap[](#testing-with-nmap "Permalink to this headline") + +``` +nmap -p + +``` + +### Testing with http and curl[](#testing-with-http-and-curl "Permalink to this headline") + +``` +curl http:// + +``` + +### Testing with curl and livez[](#testing-with-curl-and-livez "Permalink to this headline") + +This would be a typical response before changes: + +``` +curl -k https://:6443/livez?verbose +[+]ping ok +[+]log ok +[+]etcd ok +[+]poststarthook/start-kube-apiserver-admission-initializer ok +[+]poststarthook/generic-apiserver-start-informers ok +[+]poststarthook/priority-and-fairness-config-consumer ok +[+]poststarthook/priority-and-fairness-filter ok +[+]poststarthook/storage-object-count-tracker-hook ok +[+]poststarthook/start-apiextensions-informers ok +[+]poststarthook/start-apiextensions-controllers ok +[+]poststarthook/crd-informer-synced ok +[+]poststarthook/start-system-namespaces-controller ok +[+]poststarthook/bootstrap-controller ok +[+]poststarthook/rbac/bootstrap-roles ok +[+]poststarthook/scheduling/bootstrap-system-priority-classes ok +[+]poststarthook/priority-and-fairness-config-producer ok +[+]poststarthook/start-cluster-authentication-info-controller ok +[+]poststarthook/start-kube-apiserver-identity-lease-controller ok +[+]poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-kube-apiserver-identity-lease-garbage-collector ok +[+]poststarthook/start-legacy-token-tracking-controller ok +[+]poststarthook/aggregator-reload-proxy-client-cert ok +[+]poststarthook/start-kube-aggregator-informers ok +[+]poststarthook/apiservice-registration-controller ok +[+]poststarthook/apiservice-status-available-controller ok +[+]poststarthook/kube-apiserver-autoregistration ok +[+]autoregister-completion ok +[+]poststarthook/apiservice-openapi-controller ok +[+]poststarthook/apiservice-openapiv3-controller ok +[+]poststarthook/apiservice-discovery-controller ok +livez check passed + +``` + +And, this would be a typical response after the changes: + +``` +curl -k https://:6443/livez?verbose -m 5 +curl: (28) Connection timed out after 5000 milliseconds + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Compare with articles: + +[Configuring IP Whitelisting for OpenStack Load Balancer using Horizon and CLI on CloudFerro Cloud](Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html) + +[Configuring IP Whitelisting for OpenStack Load Balancer using Terraform on CloudFerro Cloud](Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/kubernetes/Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html.md b/docs/kubernetes/Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html.md new file mode 100644 index 0000000..b7861cc --- /dev/null +++ b/docs/kubernetes/Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html.md @@ -0,0 +1,206 @@ +Install GitLab on CloudFerro Cloud Kubernetes[](#install-gitlab-on-brand-name-kubernetes "Permalink to this headline") +======================================================================================================================= + +Source control is essential for building professional software. Git has become synonym of a modern source control system and GitLab is one of most popular tools based on Git. + +GitLab can be deployed as your local instance to ensure privacy of the stored artifacts. It is also the tool of choice for its rich automation capabilities. + +In this article, we will install GitLab on a Kubernetes cluster in CloudFerro Cloud cloud. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Create a Floating IP and associate the A record in DNS +> * Apply preliminary configuration +> * Install GitLab Helm chart +> * Verify the installation + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Understand Helm deployments** + +To install GitLab on Kubernetes cluster, we will use the appropriate Helm chart. The following article explains the procedure: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 3 **Kubernetes cluster without ingress controller already installed** + +The Helm chart for installation of GitHub client will install its own ingress controller, so for the sake of following this article, you should + +> * either use a cluster that does **not** have one such ingress controller already installed, or +> * create a new cluster **without** activating option **Ingress Controller** in window **Network**. That option should remain like this: + +![no-ingress-controller.png](../_images/no-ingress-controller.png) + +General explanation of how to create a Kubernetes cluster is here: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +Be sure to use cluster template for at least version 1.25, like this: + +![use_125_version.png](../_images/use_125_version.png) + +No. 4 **Have your own domain and be able to manage it** + +You will be able to manage the records of a domain associated with your gitlab instance at your domain registrar. Alternatively OpenStack on CloudFerro Cloud hosting lets you manage DNS as a service: + +[DNS as a Service on CloudFerro Cloud Hosting](../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html) + +No. 5 **Proof of concept vs. production ready version of GitLab client** + +In Step 3 below, you will create file **my-values-gitlab.yaml** to define the default configuration of the GitLab client. The values chosen there will provide for a solid quick-start, perhaps in the “proof of concept” phase of development. To customize for production, this reference will come handy: + +Step 1 Create a Floating IP and associate the A record in DNS[](#step-1-create-a-floating-ip-and-associate-the-a-record-in-dns "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Our GitLab client will run web application (GUI) exposed as a Kubernetes service. We will use GitLab’s Helm chart, which will, as part of GitLab’s installation, + +> * deploy an ingress (controller and resource) to establish service routing and +> * enable its HTTPS encryption (using CertManager). + +We will first create a Floating IP (FIP) using Horizon GUI. This FIP will be later associated with the ingress controller. To proceed go to **Network** tab, then **Floating IPs** and click on **Allocate IP to project** button. Fill in a brief description and click **Allocate IP**. + +![image-2024-4-30_14-0-23.png](../_images/image-2024-4-30_14-0-23.png) + +After closing the form, your new floating IP will appear on the list and let us say that for the sake of this article, its value is **64.225.134.173**. The next step is to create an A record that will associate the subdomain **gitlab.** with this IP address. In our case, it might look like this if you are using DNS as a Service under OpenStack Horizon UI on your CloudFerro Cloud cloud: + +![a_record_in_dns.png](../_images/a_record_in_dns.png) + +Step 2 Apply preliminary configuration[](#step-2-apply-preliminary-configuration "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +A condition to ensure compatibility with Kubernetes setup on CloudFerro Cloud clouds is to enable the Service Accounts provisioned by GitLab Helm chart to have sufficient access to reading scaling metrics. This can be done by creating an appropriate *rolebinding*. + +First, create a namespace gitlab where we will deploy the Helm chart: + +``` +kubectl create ns gitlab + +``` + +Then, create a file **gitlab-rolebinding.yaml** with the following contents: + +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: gitlab-rolebinding + namespace: gitlab +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:metrics-server-aggregated-reader + +``` + +This adds the *rolebinding* of the namespace with the appropriate metrics reading cluster role. Apply with: + +``` +kubectl apply -f gitlab-rolebinding.yaml + +``` + +Step 3 Install GitLab Helm chart[](#step-3-install-gitlab-helm-chart "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Now let’s download GitLab’s Helm repository with the following two commands: + +``` +helm repo add gitlab https://charts.gitlab.io/ +helm repo update + +``` + +Next, let’s prepare a configuration file **my-values-gitlab.yaml** to contain our specific configuration settings. They will override the default **values.yaml** configuration. + +**my-values-gitlab.yaml** + +``` +global: + edition: ce + hosts: + domain: mysampledomain.info + externalIP: 64.225.134.173 +certmanager-issuer: + email: [email protected] + +``` + +Here is a brief explanation of the concrete settings in this piece of code: + +global.edition +: **ce** – we are using the free, community edition of GitLab. + +global.hosts.domain +: Use your own domain instead of **mysampledomain.info**. + +global.hosts.externalIP +: Instead of **64.225.134.173** place the floating IP of the ingress controller that was created in Step 1. + +global.certmanager-issuer.email +: Instead of **XYZ@XXYYZZ.com**, provide your real email address. It will be stated on our GitLab client’s HTTPS certificates. + +Once all the above conditions are met, we can install a chart to the **gitlab** namespace, with the following command: + +``` +helm install gitlab gitlab/gitlab --values my-values-gitlab.yaml --namespace gitlab --version 7.11.1 + +``` + +Here is what the output of a successful installation may look like: + +![successful_installation_of_gitlab.png](../_images/successful_installation_of_gitlab.png) + +After this step, there will be several Kubernetes resources created. + +![gitlab_get_pods.png](../_images/gitlab_get_pods.png) + +Step 4 Verify the installation[](#step-4-verify-the-installation "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +After a short while, when all the pods are up, we can access Gitlab’s service entering the address: **gitlab.**: + +![image-2024-5-6_13-48-13.png](../_images/image-2024-5-6_13-48-13.png) + +In order to log in to GitLab with your initial user, use **root** as username and extract the password with the following command: + +``` +kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo + +``` + +This takes us to the following screen. From there we can utilize various features of GitLab: + +![image-2024-5-6_14-25-36.png](../_images/image-2024-5-6_14-25-36.png) + +Errors during the installation[](#errors-during-the-installation "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +In case you encounter errors during installation, which you cannot recover, it might be worth to start with fresh installation. Here is the command to delete the chart: + +``` +helm uninstall gitlab -n gitlab + +``` + +After that, you can restart the procedure from Step 2. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You now have a local instance of GitLab at your disposal. As next steps you could: + +> * Make the installation more robust and secure e.g. by setting up GitLab’s storage outside of the cluster +> * Configure custom runners +> * Set up additional users, or federate authentication to external identity provider + +These steps are not in scope of this article, refer to GitLab’s documentation for further guidelines. \ No newline at end of file diff --git a/docs/kubernetes/Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html.md b/docs/kubernetes/Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html.md new file mode 100644 index 0000000..6ee2c5f --- /dev/null +++ b/docs/kubernetes/Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html.md @@ -0,0 +1,217 @@ +Install and run Argo Workflows on CloudFerro Cloud Magnum Kubernetes[](#install-and-run-argo-workflows-on-brand-name-cloud-name-magnum-kubernetes "Permalink to this headline") +================================================================================================================================================================================ + +[Argo Workflows](https://argoproj.github.io/argo-workflows/) enable running complex job workflows on Kubernetes. It can + +> * provide custom logic for managing dependencies between jobs, +> * manage situations where certain steps of the workflow fail, +> * run jobs in parallel to crunch numbers for data processing or machine learning tasks, +> * run CI/CD pipelines, +> * create workflows with directed acyclic graphs (DAG) etc. + +Argo applies a microservice-oriented, container-native approach, where each step of a workflow runs as a container. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Authenticate to the cluster +> * Apply preliminary configuration to **PodSecurityPolicy** +> * Install Argo Workflows to the cluster +> * Run Argo Workflows from the cloud +> * Run Argo Workflows locally +> * Run sample workflow with two tasks + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** +: You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **kubectl pointed to the Kubernetes cluster** +: If you are creating a new cluster, for the purposes of this article, call it *argo-cluster*. See [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +Authenticate to the cluster[](#authenticate-to-the-cluster "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Let us authenticate to *argo-cluster*. Run from your local machine the following command to create a config file in the present working directory: + +``` +openstack coe cluster config argo-cluster + +``` + +This will output the command to set the KUBECONFIG env. variable pointing to the location of your cluster e.g. + +``` +export KUBECONFIG=/home/eouser/config + +``` + +Run this command. + +Apply preliminary configuration[](#apply-preliminary-configuration "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +OpenStack Magnum by default applies certain security restrictions for pods running on the cluster, in line with “least privileges” practice. Argo Workflows will require some additional privileges in order to run correctly. + +First create a dedicated namespace for Argo Workflows artifacts: + +``` +kubectl create namespace argo + +``` + +The next step is to create a *RoleBinding* that will add a *magnum:podsecuritypolicy:privileged* ClusterRole. Create a file *argo-rolebinding.yaml* with the following contents: + +**argo-rolebinding.yaml** + +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: argo-rolebinding + namespace: argo +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: magnum:podsecuritypolicy:privileged + +``` + +and apply with: + +``` +kubectl apply -f argo-rolebinding.yaml + +``` + +Install Argo Workflows[](#install-argo-workflows "Permalink to this headline") +------------------------------------------------------------------------------- + +In order to deploy Argo on the cluster, run the following command: + +``` +kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.4/install.yaml + +``` + +There is also an Argo CLI available for running jobs from command line. Installing it is outside of scope of this article. + +Run Argo Workflows from the cloud[](#run-argo-workflows-from-the-cloud "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +Normally, you would need to authenticate to the server via a UI login. Here, we are going to switch authentication mode by applying the following patch to the deployment. (For production, you might need to incorporate a proper authentication mechanism.) Submit the following command: + +``` +kubectl patch deployment \ + argo-server \ + --namespace argo \ + --type='json' \ + -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [ + "server", + "--auth-mode=server" +]}]' + +``` + +Argo service by default gets exposed as a Kubernetes service of *ClusterIp* type, which can be verified by typing the following command: + +``` +kubectl get services -n argo +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +argo-server ClusterIP 10.254.132.118 2746:31294/TCP 1d + +``` + +In order to expose this service to the Internet, convert type *ClusterIP* to *LoadBalancer* by patching the service with the following command: + +``` +kubectl -n argo patch service argo-server -p '{"spec": {"type": "LoadBalancer"}}' + +``` + +After a couple of minutes a cloud LoadBalancer will be generated and the External IP gets populated: + +``` +kubectl get services -n argo +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +argo-server LoadBalancer 10.254.132.118 64.225.134.153 2746:31294/TCP 1d + +``` + +The IP in our case is **64.225.134.153**. + +Argo is by default served on HTTPS with a self-signed certificate, on port **2746**. So, by typing /:2746 you should be able to access the service: + +![image2023-2-15_16-41-49.png](../_images/image2023-2-15_16-41-49.png) + +Run sample workflow with two tasks[](#run-sample-workflow-with-two-tasks "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +In order to run a sample workflow, first close the initial pop-ups in the UI. Then go to the top-left icon “Workflows” and click on it, then you might need to press “Continue” in the following pop-up. + +The next step is to click “Submit New Workflow” button in the top left part of the screen, which displays a screen similar to the one below: + +![first_argo_example.png](../_images/first_argo_example.png) + +Although you can run the workflow provided by Argo as a start, we provide here an alternative minimal example. In order to run it, create a file, which we can call **argo-article.yaml** and copy in place of the example YAML manifest: + +**argo-article.yaml** + +``` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + generateName: workflow- + namespace: argo +spec: + entrypoint: my-workflow + serviceAccountName: argo + templates: + - name: my-workflow + dag: + tasks: + - name: downloader + template: downloader-tmpl + - name: processor + template: processor-tmpl + dependencies: [downloader] + - name: downloader-tmpl + script: + image: python:alpine3.6 + command: [python] + source: | + print("Files downloaded") + - name: processor-tmpl + script: + image: python:alpine3.6 + command: [python] + source: | + print("Files processed") + +``` + +This sample mocks a workflow with 2 tasks/jobs. First the downloader task runs, once it finished the processor task does its part. Some highlights about this workflow definition: + +> * Both tasks run as containers. So for each task, the **python:alpine3.6** container is first pulled from DockerHub registry. Then this container does a simple work of printing a text. In a production workflow, rather than using a script, the code with your logic would be pulled of your container registry as a custom Docker image. +> * The order of executing the script is here defined using **DAG** (Directed Acyclic Graph). This allows for specifying the task dependencies in the dependencies section. In our case the dependency is placed on the Processor, so it will only start after the Downloader finishes. If we skipped the dependencies on the Processor, it would run in parallel with the Downloader. +> * Each task in this sequence runs as a Kubernetes pod. When a task is done the pod completes, which frees the resources on the cluster. + +You can run this sample by clicking the “+Create” button. Once the workflow completes you should see an outcome as per below: + +![image2023-2-15_17-50-44.png](../_images/image2023-2-15_17-50-44.png) + +Also, when clicking on each step, on the right side of the screen there is more information displayed. E.g. when clicking on the Processor step, we can see its logs in the bottom right part of the screen. + +The results show that indeed the message “Files processed” was printed in the container: + +![image2023-2-15_18-13-51.png](../_images/image2023-2-15_18-13-51.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +For production, consider alternative authentication mechanism and replacing self-signed HTTPS certificates with the ones generated by a Certificate Authority. \ No newline at end of file diff --git a/docs/kubernetes/Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md b/docs/kubernetes/Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md new file mode 100644 index 0000000..e6bf112 --- /dev/null +++ b/docs/kubernetes/Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md @@ -0,0 +1,233 @@ +Install and run Dask on a Kubernetes cluster in CloudFerro Cloud cloud[](#install-and-run-dask-on-a-kubernetes-cluster-in-brand-name-cloud "Permalink to this headline") +========================================================================================================================================================================= + +[Dask](https://www.dask.org/) enables scaling computation tasks either as multiple processes on a single machine, or on Dask clusters that consist of multiple worker machines. Dask provides a scalable alternative to popular Python libraries e.g. Numpy, Pandas or SciKit Learn, but still using a compact and very similar API. + +Dask scheduler, once presented with a computation task, splits it into smaller tasks that can be executed in parallel on the worker nodes/processes. + +In this article you will install a Dask cluster on Kubernetes and run Dask worker nodes as Kubernetes pods. As part of the installation, you will get access to a Jupyter instance, where you can run the sample code. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install Dask on Kubernetes +> * Access Jupyter and Dask Scheduler dashboard +> * Run a sample computing task +> * Configure Dask cluster on Kubernetes from Python +> * Resolving errors + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Kubernetes cluster on CloudFerro cloud** + +To create Kubernetes cluster on cloud refer to this guide: [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Access to kubectl command line** + +The instructions for activation of **kubectl** are provided in: [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 4 **Familiarity with Helm** + +For more information on using Helm and installing apps with Helm on Kubernetes, refer to [Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 5 **Python3 available on your machine** + +> Python3 preinstalled on the working machine. + +No. 6 **Basic familiarity with Jupyter and Python scientific libraries** + +> We will use [Pandas](https://pandas.pydata.org/docs/user_guide/index.html#user-guide) as an example. + +Step 1 Install Dask on Kubernetes[](#step-1-install-dask-on-kubernetes "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +To install Dask as a Helm chart, first download the Dask Helm repository: + +``` +helm repo add dask https://helm.dask.org/ + +``` + +Instead of installing the chart out of the box, let us customize the configuration for convenience. To view all possible configurations and their defaults run: + +``` +helm show dask/dask + +``` + +Prepare file *dask-values.yaml* to override some of the defaults: + +**dask-values.yaml** + +``` +scheduler: + serviceType: LoadBalancer +jupyter: + serviceType: LoadBalancer +worker: + replicas: 4 + +``` + +This changes the default service type for Jupyter and Scheduler to LoadBalancer, so that they get exposed publicly. Also, the default number of Dask workers is 3 but is now changed to 4. Each Dask worker pod will get allocated 3GB RAM and 1CPU, we keep it at this default. + +To deploy the chart, create the namespace *dask* and install to it: + +``` +helm install dask dask/dask -n dask --create-namespace -f dask-values.yaml + +``` + +Step 2 Access Jupyter and Dask Scheduler dashboard[](#step-2-access-jupyter-and-dask-scheduler-dashboard "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------- + +After the installation step, you can access Dask services: + +``` +kubectl get services -n dask + +``` + +There are two services, for Jupyter and Dask Scheduler dashboard. Populating external IPs will take few minutes: + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +dask-jupyter LoadBalancer 10.254.230.230 64.225.128.91 80:32437/TCP 6m49s +dask-scheduler LoadBalancer 10.254.41.250 64.225.128.236 8786:31707/TCP,80:31668/TCP 6m49s + +``` + +We can paste the external IPs to the browser to view the services. To access Jupyter, you will first need to pass the login screen, the default password is *dask*. Then you can view the Jupyter instance: + +![image2023-8-8_14-2-4.png](../_images/image2023-8-8_14-2-4.png) + +Similarly, with the Scheduler Dashboard, paste the floating IP to the browser to view it. If you then click on the “Workers” tab above, you can see that 4 workers are running on our Dask cluster: + +![image2023-8-8_14-4-40.png](../_images/image2023-8-8_14-4-40.png) + +Step 3 Run a sample computing task[](#step-3-run-a-sample-computing-task "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +The installed Jupyter instance already contains Dask and other useful Python libraries installed. To run a sample job, first activate the notebook by clicking on icon named **NoteBook** → **Python3(ipykernel)** on the right hand side of the Jupyter instance browser screen. + +The sample job performs calculation on table (dataframe) of 100k rows, and just one column. Each record will be filled with a random integer from 1 to 100,000 and the task is to calculate the sum of all records. + +The code will run the same example for Pandas (single process) and Dask (parallelized on our cluster) and we will be able to inspect the results. + +Copy the following code and paste to the cell in Jupyter notebook: + +``` +import dask.dataframe as dd +import pandas as pd +import numpy as np +import time + +data = {'A': np.random.randint(1, 100_000_000, 100_000_000)} +df_pandas = pd.DataFrame(data) +df_dask = dd.from_pandas(df_pandas, npartitions=4) + +# Pandas +start_time_pandas = time.time() +result_pandas = df_pandas['A'].sum() +end_time_pandas = time.time() +print(f"Result Pandas: {result_pandas}") +print(f"Computation time Pandas: {end_time_pandas - start_time_pandas:.2f} seconds.") + +# Dask +start_time_dask = time.time() +result_dask = df_dask['A'].sum().compute() +end_time_dask = time.time() +print(f"Result Dask: {result_dask}") +print(f"Computation time Dask: {end_time_dask - start_time_dask:.2f} seconds.") + +``` + +Hit play or use option Run from the main menu to execute the code. After a few seconds, the result will appear below the cell with code. + +Some of the results we could observe for this example: + +``` +Result Pandas: 4999822570722943 +Computation time Pandas: 0.15 seconds. +Result Dask: 4999822570722943 +Computation time Dask: 0.07 seconds. + +``` + +Note these results are not deterministic and simple Pandas could also perform better case by case. The overhead to distribute and collect results from Dask workers needs to be also taken into account. Further tuning the performance of Dask is beyond the scope of this article. + +Step 4 Configure Dask cluster on Kubernetes from Python[](#step-4-configure-dask-cluster-on-kubernetes-from-python "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------- + +For managing the Dask cluster on Kubernetes we can use a dedicated Python library *dask-kubernetes*. Using this library, we can reconfigure certain parameters of our Dask cluster. + +One way to run *dask-kubernetes* would be from the Jupyter instance but then we would have to provide reference to *kubeconfig* of our cluster. Instead, we install *dask-kubernetes* in our local environment, with the following command: + +``` +pip install dask-kubernetes + +``` + +Once this is done, we can manage the Dask cluster from Python. As an example, let us upscale it to 5 Dask nodes. Use *nano* to create file *scale-cluster.py*: + +``` +nano scale-cluster.py + +``` + +then insert the following commands: + +**scale-cluster.py** + +``` +from dask_kubernetes import HelmCluster + +cluster = HelmCluster(release_name="dask", namespace="dask") +cluster.scale(5) + +``` + +Apply with: + +``` +python3 scale-cluster.py + +``` + +Using the command + +``` +kubectl get pods -n dask + +``` + +you can see that the number of workers now is 5: + +![kubectl_show_5_workers.png](../_images/kubectl_show_5_workers.png) + +Or, you can see the current number of worker nodes in the Dask Scheduler dashboard (refresh the screen): + +![dask_dashboard_5_workers.png](../_images/dask_dashboard_5_workers.png) + +Note that the functionalities of *dask-kubernetes* should be possible to achieve using just Kubernetes API directly, the choice will depend on your personal preference. + +Resolving errors[](#resolving-errors "Permalink to this headline") +------------------------------------------------------------------- + +When running command + +``` +python3 scale-cluster.py + +``` + +on WSL version 1, error messages such as these may appear: + +![wsl_v1_error_message.png](../_images/wsl_v1_error_message.png) + +The code will work properly, that is, it will increase the number of workers to 5, as required. The error should not appear on WSL version 2 and other Ubuntu distros. \ No newline at end of file diff --git a/docs/kubernetes/Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..63bbfe7 --- /dev/null +++ b/docs/kubernetes/Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html.md @@ -0,0 +1,534 @@ +Install and run NooBaa on Kubernetes cluster in single- and multicloud-environment on CloudFerro Cloud[](#install-and-run-noobaa-on-kubernetes-cluster-in-single-and-multicloud-environment-on-brand-name "Permalink to this headline") +======================================================================================================================================================================================================================================== + +[NooBaa](https://www.noobaa.io/) enables creating an abstracted S3 backend on Kubernetes. Such backend can be connected to multiple S3 backing stores e.g. in a multi-cloud setup, allowing for storage expandability or High Availability among other beneficial features. + +In this article you will learn the basics of using NooBaa + +> * how to install it on Kubernetes cluster +> * how to create a NooBaa bucket backed by S3 object storage in the CloudFerro Cloud cloud +> * how to create a NooBaa bucket mirroring data on two different clouds + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install NooBaa in local environment +> * Apply preliminary configuration +> * Install NooBaa on the Kubernetes cluster +> * Create a NooBaa backing store +> * Create a Bucket Class +> * Create an ObjectBucketClaim +> * Connect to NooBaa bucket from S3cmd +> * Testing access to the bucket +> * Create mirroring on clouds WAW3-1 and WAW3-2 + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Access to Kubernetes cluster on WAW3-1 cloud** + +A cluster on WAW3-1 cloud, where we will run our NooBaa installation - follow guidelines in this article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 3 **Familiarity with using Object Storage on CloudFerro clouds** + +More information in [How to use Object Storage on CloudFerro Cloud](../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html) + +Traditional OpenStack term for imported or downloaded files is *Containers* in main menu option *Object Store*. We will use the term “bucket” for object storage containers, to differentiate vs. container term in Docker/Kubernetes sense. + +No. 4 **kubectl operational** + +**kubectl** CLI tool installed and pointing to your cluster via KUBECONFIG env. variable - more information in [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 5 **Access to private S3 keys in WAW3-1 cloud** + +You may also use access to OpenStack CLI to generate and read the private S3 keys - [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html). + +No. 6 **Familiarity with s3cmd for accessing object storage** + +For more info on **s3cmd**, see [How to access private object storage using S3cmd or boto3 on CloudFerro Cloud](../s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html). + +No. 7 **Access to WAW3-2 cloud** + +To mirror data on WAW3-1 and WAW3-2, you will need access to those two clouds. + +Install NooBaa in local environment[](#install-noobaa-in-local-environment "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +The first step to work with NooBaa is to install it on our local system. We will download the installer, make it executable and move it to the system path: + +``` +curl -LO https://github.com/noobaa/noobaa-operator/releases/download/v5.11.0/noobaa-linux-v5.11.0 +chmod +x noobaa-linux-v5.11.0 +sudo mv noobaa-linux-v5.11.0 /usr/local/bin/noobaa + +``` + +Enter the password for root user, if required. + +After this sequence of steps, it should be possible to run a test command + +``` +noobaa help + +``` + +This will result in an output similar to the below: + +![install_noobaa_locally.png](../_images/install_noobaa_locally.png) + +Apply preliminary configuration[](#apply-preliminary-configuration "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +We will need to apply additional configuration on a Magnum cluster to avoid PodSecurityPolicy exception. For a refresher, see article [Installing JupyterHub on Magnum Kubernetes Cluster in CloudFerro Cloud Cloud](Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html). + +Let’s start by creating a dedicated namespace for Noobaa artifacts: + +``` +kubectl create namespace noobaa + +``` + +Then create a file *noobaa-rolebinding.yaml* with the following contents: + +**noobaa-rolebinding.yaml** + +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: noobaa-rolebinding + namespace: noobaa +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: magnum:podsecuritypolicy:privileged + +``` + +and apply with: + +``` +kubectl apply -f noobaa-rolebinding.yaml + +``` + +Install NooBaa on the Kubernetes cluster[](#install-noobaa-on-the-kubernetes-cluster "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +We already have NooBaa available in our local environment, but we still need to install NooBaa on our Kubernetes cluster. NooBaa will use the context of the KUBECONFIG by **kubectl** (as activated in Prerequisite No. 4), so install NooBaa in the dedicated namespace: + +``` +noobaa install -n noobaa + +``` + +After a few minutes, this will install NooBaa and provide additional information about the setup. See the status of NooBaa with command + +``` +noobaa status -n noobaa + +``` + +It outputs several useful insights about the NooBaa installation, with the “key facts” available towards the end of this status: + +> * NooBaa created a default backing store called *noobaa-default-backing-store*, backed by a block volume created in OpenStack. +> * S3 credentials are provided to access the bucket created with the default backing store. Such volume-based backing store has its use e.g. for utilizing the S3 access method to our block storage. + +For the purpose of this article, we will not use the default backing store, but rather learn to create a new backing store based on cloud S3 object storage. Such setup can be then easily extended so that we can end up with separate backing stores for different clouds. In the second part of this article you will create one store on WAW3-1 cloud, another one on WAW3-2 cloud and they will be available through one abstracted S3 bucket in NooBaa. + +Create a NooBaa backing store[](#create-a-noobaa-backing-store "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +### Step 1. Create object storage bucket on WAW3-1[](#step-1-create-object-storage-bucket-on-waw3-1 "Permalink to this headline") + +Now create an object storage bucket on WAW3-1 cloud: + +> * switch to Horizon, +> * use commands **Object Store** –> **Containers** –> **+ Container** to create a new object bucket. + +![create_object_container.png](../_images/create_object_container.png) + +Buckets on WAW3-1 cloud need to have unique names. In our case, we use bucket name *noobaademo-waw3-1* which we will use throughout the article. + +Note + +You need to create a bucket with a different name and use this generated name to follow along. + +### Step 2. Set up EC2 credentials[](#step-2-set-up-ec2-credentials "Permalink to this headline") + +If you have properly set up the EC2 (S3) keys for your WAW3-1 object storage, take note of them with the following command: + +``` +openstack ec2 credentials list + +``` + +### Step 3. Create a new NooBaa backing store[](#step-3-create-a-new-noobaa-backing-store "Permalink to this headline") + +With the above in place, we can create a new NooBaa backing store called *custom-bs* by running the command below. Make sure to replace the access-key XXXXXX and the secret-key YYYYYYY with your own EC2 keys and the *bucket* with your own bucket name: + +``` +noobaa -n noobaa backingstore create s3-compatible custom-bs --endpoint https://s3.waw3-1.cloudferro.com --signature-version v4 --access-key XXXXXX \ +--secret-key YYYYYYY --target-bucket noobaademo-waw3-1 + +``` + +Note that the credentials get stored as a Kubernetes secret in the namespace. You can verify that the backing store and the secret got created by running the following commands: + +``` +kubectl get backingstore -n noobaa +kubectl get secret -n noobaa + +``` + +The naming of the artifacts will follow the name of the backing store in case there are already more such resources available in the namespace. + +Also, when viewing the bucket in Horizon (backing store), we can see NooBaa populated it’s folder structure: + +![image2023-7-20_11-58-22.png](../_images/image2023-7-20_11-58-22.png) + +### Step 4. Create a Bucket Class[](#step-4-create-a-bucket-class "Permalink to this headline") + +When we have the backing store, the next step is to create a BucketClass (BC). Such BucketClass serves as a blueprint for NooBaa buckets: it defines + +> * which BackingStore(s) these buckets will use, and +> * which placement strategy to use in case of multiple bucket stores. + +The placement strategy could be *Mirror* or *Spread*. There is also support for using multiple tiers, where data is by default pushed to the first tier, and when this is full, to the next one. + +In order to create a *BucketClass*, prepare the following file *custom-bc.yaml*: + +**custom-bc.yaml** + +``` +apiVersion: noobaa.io/v1alpha1 +kind: BucketClass +metadata: + labels: + app: noobaa + name: custom-bc + namespace: noobaa +spec: + placementPolicy: + tiers: + - backingStores: + - custom-bs + placement: Spread + +``` + +Then apply with: + +``` +kubectl apply -f custom-bc.yaml + +``` + +### Step 5. Create an ObjectBucketClaim[](#step-5-create-an-objectbucketclaim "Permalink to this headline") + +As the last step, we create an *ObjectBucketClaim*. This bucket claim utilizes the *noobaa.noobaa.io* storage class which got deployed with NooBaa, and references the *custom-bc* bucket class created in the previous step. Create a file called *custom-obc.yaml*: + +**custom-obc.yaml** + +``` +apiVersion: objectbucket.io/v1alpha1 +kind: ObjectBucketClaim +metadata: + name: custom-obc + namespace: noobaa +spec: + generateBucketName: my-bucket + storageClassName: noobaa.noobaa.io + additionalConfig: + bucketclass: custom-bc + +``` + +Then apply with: + +``` +kubectl apply -f custom-obc.yaml + +``` + +### Step 6. Obtain name of the NooBaa bucket[](#step-6-obtain-name-of-the-noobaa-bucket "Permalink to this headline") + +As a result, besides the *ObjectBucket* claim resource, also a configmap and a secret with the same name *custom-obc* got created in NooBaa. Let’s view the configmap with: + +``` +kubectl get configmap custom-obc -n noobaa -o yaml + +``` + +The result is similar to the following: + +``` +apiVersion: v1 +data: + BUCKET_HOST: s3.noobaa.svc + BUCKET_NAME: my-bucket-7941ba4a-f57b-400a-b870-b337ec5284cf + BUCKET_PORT: "443" + BUCKET_REGION: "" + BUCKET_SUBREGION: "" +kind: ConfigMap +metadata: + ... + +``` + +We can see the name of the NooBaa bucket *my-bucket-7941ba4a-f57b-400a-b870-b337ec5284cf*, which is backing up our “physical” WAW3-1 bucket. Store this name for later use in this article. + +### Step 7. Obtain secret for the NooBaa bucket[](#step-7-obtain-secret-for-the-noobaa-bucket "Permalink to this headline") + +The secret is also relevant for us as we need to extract the S3 keys to the NooBaa bucket. The access and secret key are base64 encoded in the secret, we can retrieve them decoded with the following commands: + +``` +kubectl get secret custom-obc -n noobaa -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode +kubectl get secret custom-obc -n noobaa -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode + +``` + +Take note of access and secret keys, as we will use them in the next step. + +### Step 8. Connect to NooBaa bucket from S3cmd[](#step-8-connect-to-noobaa-bucket-from-s3cmd "Permalink to this headline") + +Noobaa created a few services when it got deployed, which we can verify with the command below: + +``` +kubectl get services -n noobaa + +``` + +The output should be similar to the one below: + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +noobaa-db-pg ClusterIP 10.254.158.217 5432/TCP 3h24m +noobaa-mgmt LoadBalancer 10.254.145.9 64.225.135.152 80:31841/TCP,443:31736/TCP,8445:32063/TCP,8446:32100/TCP 3h24m +s3 LoadBalancer 10.254.244.226 64.225.133.81 80:30948/TCP,443:31609/TCP,8444:30079/TCP,7004:31604/TCP 3h24m +sts LoadBalancer 10.254.23.154 64.225.135.92 443:31374/TCP 3h24m + +``` + +The “s3” service provides the endpoint that can be used to access Nooba storage (backed by the actual storage in WAW3-1). In our case, this endpoint URL is **64.225.133.81**. Replace it with the value you get from the above command, when working through this article. + +### Step 9. Configure S3cmd to access NooBaa[](#step-9-configure-s3cmd-to-access-noobaa "Permalink to this headline") + +Now that we have both the endpoint and the keys, we can configure **s3cmd** to access the bucket created by NooBaa. Create a configuration file *noobaa.s3cfg* with the following contents: + +``` +check_ssl_certificate = False +check_ssl_hostname = False +access_key = XXXXXX +secret_key = YYYYYY +host_base = 64.225.133.81 +host_bucket = 64.225.133.81 +use_https = True +verbosity = WARNING +signature_v2 = False + +``` + +Then from the same location apply with: + +``` +s3cmd --configure -c noobaa.s3cfg + +``` + +If the **s3cmd** is not installed on your system, see Prerequisite No. 6. + +The **s3cmd** command will let you press Enter to confirm each value from config file and let you change it on the fly, if different from default. + +Omitting those questions in the output below, the result should be similar to the following: + +``` +... +Success. Your access key and secret key worked fine :-) + +Now verifying that encryption works... +Not configured. Never mind. + +Save settings? [y/N] y +Configuration saved to 'noobaa.s3cfg' + +``` + +### Step 10. Testing access to the bucket[](#step-10-testing-access-to-the-bucket "Permalink to this headline") + +We can upload a test file to NooBaa. In our case, we upload a simple text file *xyz.txt* with text content “xyz”, using the following command: + +``` +s3cmd put xyz.txt s3://my-bucket-7941ba4a-f57b-400a-b870-b337ec5284cf -c noobaa.s3cfg + +``` + +The file gets uploaded correctly: + +``` +upload: 'xyz.txt' -> 's3://my-bucket-7941ba4a-f57b-400a-b870-b337ec5284cf/xyz.txt' [1 of 1] + 4 of 4 100% in 0s 5.67 B/s done + +``` + +We can also see in Horizon that a few new folders and files were added to NooBaa. However, we will not see the *xyz.txt* file directly there, because NooBaa applies its own fragmentation techniques on the data. + +Connect NooBaa in a multi-cloud setup[](#connect-noobaa-in-a-multi-cloud-setup "Permalink to this headline") +------------------------------------------------------------------------------------------------------------- + +NooBaa can be used to create an abstracted S3 endpoint, connected to two or more cloud S3 endpoints. This can be helpful in scenarios of e.g. replicating the same data in multiple clouds or combining the storage of multiple clouds. + +In this section of the article we demonstrate the “mirroring scenario”. We create an S3 NooBaa endpoint replicating (mirroring) data between WAW3-1 cloud and WAW3-2 cloud. + +Note + +To illustrate the process, we are going create a new set of resources, new S3 buckets and introduce new naming of the entities. The steps 1 to 9 from above are almost identical so we shall denote them as **Step 1 Multi-cloud**, **Step 2 Multi-cloud** and so on. + +To proceed, first create two additional buckets from the Horizon interface. Replace the further commands and file contents in this section to reflect these bucket names. + +### Step 1 Multi-cloud. Create bucket on WAW3-1[](#step-1-multi-cloud-create-bucket-on-waw3-1 "Permalink to this headline") + +Go to WAW3-1 Horizon interface and create a bucket we call *noobaamirror-waw3-1* (supply your own bucket name here and adhere to it in the rest of the article). It will be the available on endpoint . + +### Step 1 Multi-cloud. Create bucket on WAW3-2[](#step-1-multi-cloud-create-bucket-on-waw3-2 "Permalink to this headline") + +Next, go to WAW3-2 Horizon interface and create a bucket we call *noobaamirror-waw3-2* (again, supply your own bucket name here and adhere to it in the rest of the article). It will be available on endpoint + +### Step 2 Multi-cloud. Set up EC2 credentials[](#step-2-multi-cloud-set-up-ec2-credentials "Permalink to this headline") + +Use the existing pair of EC2 credentials or first create a new pair and then use them in the next step. + +### Step 3 Multi-cloud. Create backing store mirror-bs1 on WAW3-1[](#step-3-multi-cloud-create-backing-store-mirror-bs1-on-waw3-1 "Permalink to this headline") + +Apply the following command to create *mirror-bs1* backing store (change names of: bucket name, S3 access key, S3 secret key to your own): + +``` +noobaa -n noobaa backingstore create s3-compatible mirror-bs1 --endpoint https://s3.waw3-1.cloudferro.com --signature-version v4 --access-key XXXXXX --secret-key YYYYYY --target-bucket noobaamirror-waw3-1 + +``` + +### Step 3 Multi-cloud. Create backing store mirror-bs2 on WAW3-2[](#step-3-multi-cloud-create-backing-store-mirror-bs2-on-waw3-2 "Permalink to this headline") + +Apply the following command to create *mirror-bs2* backing store (change names of: bucket name, S3 access key, S3 secret key to your own): + +``` +noobaa -n noobaa backingstore create s3-compatible mirror-bs2 --endpoint https://s3.waw3-2.cloudferro.com --signature-version v4 --access-key XXXXXX --secret-key YYYYYY --target-bucket noobaamirror-waw3-2 + +``` + +### Step 4 Multi-cloud. Create a Bucket Class[](#step-4-multi-cloud-create-a-bucket-class "Permalink to this headline") + +To create a BucketClass called *bc-mirror*, create a file called *bc-mirror.yaml* with the following contents: + +**bc-mirror.yaml** + +``` +apiVersion: noobaa.io/v1alpha1 +kind: BucketClass +metadata: + labels: + app: noobaa + name: bc-mirror + namespace: noobaa +spec: + placementPolicy: + tiers: + - backingStores: + - mirror-bs1 + - mirror-bs2 + placement: Mirror + +``` + +and apply with: + +``` +kubectl apply -f bc-mirror.yaml + +``` + +Note + +The mirroring is implemented by listing **two** backing stores, *mirror-bs1* and *mirror-bs1*, under the *tiers* option. + +### Step 5 Multi-cloud. Create an ObjectBucketClaim[](#step-5-multi-cloud-create-an-objectbucketclaim "Permalink to this headline") + +Again, create file *obc-mirror.yaml* for ObjectBucketClaim *obc-mirror*: + +**obc-mirror.yaml** + +``` +apiVersion: objectbucket.io/v1alpha1 +kind: ObjectBucketClaim +metadata: + name: obc-mirror + namespace: noobaa +spec: + generateBucketName: my-bucket + storageClassName: noobaa.noobaa.io + additionalConfig: + bucketclass: bc-mirror + +``` + +and apply with: + +``` +kubectl apply -f obc-mirror + +``` + +### Step 6 Multi-cloud. Obtain name of the NooBaa bucket[](#step-6-multi-cloud-obtain-name-of-the-noobaa-bucket "Permalink to this headline") + +Extract bucket name from the configmap: + +``` +kubectl get configmap obc-mirror -n noobaa -o yaml + +``` + +### Step 7 Multi-cloud. Obtain secret for the NooBaa bucket[](#step-7-multi-cloud-obtain-secret-for-the-noobaa-bucket "Permalink to this headline") + +Extract S3 keys from the created secret: + +``` +kubectl get secret obc-mirror -n noobaa -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode +kubectl get secret obc-mirror -n noobaa -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode + +``` + +### Step 8 Multi-cloud. Connect to NooBaa bucket from S3cmd[](#step-8-multi-cloud-connect-to-noobaa-bucket-from-s3cmd "Permalink to this headline") + +Create additional config file for s3cmd e.g. *noobaa-mirror.s3cfg* and update the access key, the secret key and the bucket name to the ones retrieved above: + +``` +s3cmd --configure -c noobaa-mirror.s3cfg + +``` + +### Step 9 Multi-cloud. Configure S3cmd to access NooBaa[](#step-9-multi-cloud-configure-s3cmd-to-access-noobaa "Permalink to this headline") + +To test, upload the *xyz.txt* file, which behind the scenes uploads a copy to both clouds. Be sure to change the bucket name *my-bucket-aa6b8a23-4a77-4306-ae36-0248fc1c44ff* to the one retrieved from the configmap: + +``` +s3cmd put xyz.txt s3://my-bucket-aa6b8a23-4a77-4306-ae36-0248fc1c44ff -c noobaa-mirror.s3cfg + +``` + +### Step 10 Multi-cloud. Testing access to the bucket[](#step-10-multi-cloud-testing-access-to-the-bucket "Permalink to this headline") + +To verify, delete the “physical” bucket on one of the clouds (e.g. from WAW3-1) from the Horizon interface. With the **s3cmd** command below you can see that NooBaa will still hold the copy from WAW3-2 cloud: + +``` +s3cmd ls s3://my-bucket-aa6b8a23-4a77-4306-ae36-0248fc1c44ff -c noobaa-mirror.s3cfg +2023-07-21 09:47 4 s3://my-bucket-aa6b8a23-4a77-4306-ae36-0248fc1c44ff/xyz.txt + +``` \ No newline at end of file diff --git a/docs/kubernetes/Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html.md b/docs/kubernetes/Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html.md new file mode 100644 index 0000000..c027b97 --- /dev/null +++ b/docs/kubernetes/Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html.md @@ -0,0 +1,550 @@ +Installing HashiCorp Vault on CloudFerro Cloud Magnum[](#installing-hashicorp-vault-on-brand-name-cloud-name-magnum "Permalink to this headline") +================================================================================================================================================== + +In Kubernetes, a *Secret* is an object that contains passwords, tokens, keys or any other small pieces of data. Using *Secrets* ensures that the probability of exposing confidential data while creating, running and editing Pods is much smaller. The main problem is that *Secrets* are stored unencrypted in *etcd* so anyone with + +> * API access, as well as anyone who +> * can create a Pod or create a Deployment in a namespace + +can also retrieve or modify a Secret. + +You can apply a number of strategies to improve the security of the cluster or you can install a specialized solution such as [HashiCorp Vault](https://www.vaultproject.io/). It offers + +> * secure storage of all kinds of secrets – passwords, TLS certificates, database credentials, API encryption keys and others, +> * encryption of all of the data, +> * dynamic serving of the credentials, +> * granular access policies for users, applications, and services, +> * logging and auditing of data usage, +> * revoking or deleting any key or secret, +> * setting automated secret rotation – for administrators and users alike. + +In this article, we shall install HashiCorp Vault within a Magnum Kubernetes cluster, on CloudFerro Cloud cloud. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install self-signed TLS certificates with CFSSL +> * Generate certificates to enable encryption of traffic with Vault +> * Install Consul storage backend for High Availability +> * Install Vault +> * Sealing and unsealing the Vault +> * Unseal Vault +> * Run Vault UI +> * Return livenessProbe to production value +> * Troubleshooting + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Familiarity with kubectl** + +You should have an appropriate Kubernetes cluster up and running, with **kubectl** pointing to it [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Familiarity with deploying Helm charts** + +This article will introduce you to Helm charts on Kubernetes: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +Step 1 Install CFSSL[](#step-1-install-cfssl "Permalink to this headline") +--------------------------------------------------------------------------- + +To ensure that Vault communication with the cluster is encrypted, we need to provide TLS certificates. + +We will use the self-signed TLS certificates issued by a private Certificate Authority. To generate them we will use CFSSL utilities: **cfssl** and **cfssljson**. + +**cfssl** is a CLI utility. **cfssljson** takes the JSON output from **cfssl** and writes certificates, keys, and CSR (certificate signing requests). + +We need to download the binaries of both tools: **cfssl** and **cfssljson** from and make them executable: + +``` +curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64 -o cfssl +curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 -o cfssljson +chmod +x cfssl +chmod +x cfssljson + +``` + +Then we also need to add them to our path: + +``` +sudo mv cfssl cfssljson /usr/local/bin + +``` + +Step 2 Generate TLS certificates[](#step-2-generate-tls-certificates "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Before we start, let’s create a dedicated namespace where all Vault-related Kubernetes resources will live: + +``` +kubectl create namespace vault + +``` + +We will need to issue two sets of certificates. The first set will be a root certificate for Certificate Authority. The second will reference the CA certificate and create the actual Vault cert. + +To create the key request for CA, we will base it on a JSON file **ca-csr.json**. Create this file in your favorite editor, and if you want to, substitute the certificate details to your own use case: + +**ca-csr.json** + +``` +{ + "hosts": [ + "cluster.local" + ], + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "Poland", + "L": "Warsaw", + "O": "MyOrganization" + } + ] +} + +``` + +Then issue the command to generate a self-signed root CA certificate. + +``` +cfssl gencert -initca ca-csr.json | cfssljson -bare ca + +``` + +You should see output similar to the following: + +``` +2023/01/02 15:27:36 [INFO] generating a new CA key and certificate from CSR +2023/01/02 15:27:36 [INFO] generate received request +2023/01/02 15:27:36 [INFO] received CSR +2023/01/02 15:27:36 [INFO] generating key: rsa-2048 +2023/01/02 15:27:36 [INFO] encoded CSR +2023/01/02 15:27:36 [INFO] signed certificate with serial number 472447709029717049436439292623827313295747809061 + +``` + +Also, as a result, three entities are generated: + +> * the private key, +> * the CSR, and the +> * self-signed certificate (*ca.pem*, *ca.csr*, *ca-key.pem*). + +The next step is to create Vault certificates, which reference the private CA. To do so, first create a configuration file *ca-config.json*, to override the default configuration. This is especially useful for changing certificate validity: + +**ca-config.json** + +``` +{ + "signing": { + "default": { + "expiry": "17520h" + }, + "profiles": { + "default": { + "usages": ["signing", "key encipherment", "server auth", "client auth"], + "expiry": "17520h" + } + } + } +} + +``` + +Then generate the Vault keys, referencing this file and the CA keys: + +``` +cfssl gencert \ + -ca ./ca.pem \ + -ca-key ./ca-key.pem \ + -config ca-config.json \ + -profile default \ + -hostname="vault,vault.vault.svc.cluster.local,localhost,127.0.0.1" \ + ca-csr.json | cfssljson -bare vault + +``` + +The result will be the following: + +``` +2023/01/02 16:19:52 [INFO] generate received request +2023/01/02 16:19:52 [INFO] received CSR +2023/01/02 16:19:52 [INFO] generating key: rsa-2048 +2023/01/02 16:19:52 [INFO] encoded CSR +2023/01/02 16:19:52 [INFO] signed certificate with serial number 709743788174272015258726707100830785425213226283 + +``` + +Also, another three files get created in your working folder: *vault.pem*, *vault.csr*, *vault-key.pem*. + +The last step is to store the generated keys as Kubernetes TLS secrets on our cluster: + +``` +kubectl -n vault create secret tls tls-ca --cert ./ca.pem --key ./ca-key.pem -n vault +kubectl -n vault create secret tls tls-server --cert ./vault.pem --key ./vault-key.pem -n vault + +``` + +The naming of those secrets reflects the Vault Helm chart default names. + +Step 3 Install Consul Helm chart[](#step-3-install-consul-helm-chart "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +The Consul backend will ensure High Availability of our Vault installation. Consul will live in a namespace that we have already created, **vault**. + +Here is an override configuration file for the Consul Helm chart: *consul-values.yaml*. + +**consul-values.yaml** + +``` +global: + datacenter: vault-kubernetes-guide + +client: + enabled: true + +server: + replicas: 1 + bootstrapExpect: 1 + disruptionBudget: + maxUnavailable: 0 + +``` + +Now install the *hashicorp* repository of Helm charts and verify that *vault* is in it: + +``` +helm repo add hashicorp https://helm.releases.hashicorp.com +helm search repo hashicorp/vault + +``` + +As the last step, install Consul chart: + +``` +helm install consul hashicorp/consul -f consul-values.yaml -n vault + +``` + +This is the report about success of the installation: + +``` +NAME: consul +LAST DEPLOYED: Thu Feb 9 18:52:58 2023 +NAMESPACE: vault +STATUS: deployed +REVISION: 1 +NOTES: +Thank you for installing HashiCorp Consul! + +Your release is named consul. + +``` + +Shortly, several Consul pods will get deployed in the *vault* namespace. Run the following command to verify it: + +``` +kubectl get pods -n vault + +``` + +Wait until all of the pods are **Running** and then proceed with the next step. + +Step 4 Install Vault Helm chart[](#step-4-install-vault-helm-chart "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +We are now ready to install Vault. + +First, let’s provide file *vault-values.yaml* which will override configuration file for the Vault Helm chart. These overrides ensure turning on encryption, High Availability, setting up larger time for *readinessProbe* and exposing the UI as LoadBalancer service type: + +**vault-values.yaml** + +``` +# Vault Helm Chart Value Overrides +global: + enabled: true + tlsDisable: false + +injector: + enabled: true + image: + repository: "hashicorp/vault-k8s" + tag: "0.14.1" + + resources: + requests: + memory: 500Mi + cpu: 500m + limits: + memory: 1000Mi + cpu: 1000m + +server: + # These Resource Limits are in line with node requirements in the + # Vault Reference Architecture for a Small Cluster + + image: + repository: "hashicorp/vault" + tag: "1.9.2" + + # For HA configuration and because we need to manually init the vault, + # we need to define custom readiness/liveness Probe settings + readinessProbe: + enabled: true + path: "/v1/sys/health?standbyok=true&sealedcode=204&uninitcode=204" + livenessProbe: + enabled: true + path: "/v1/sys/health?standbyok=true" + initialDelaySeconds: 360 + + extraEnvironmentVars: + VAULT_CACERT: /vault/userconfig/tls-ca/tls.crt + + # extraVolumes is a list of extra volumes to mount. These will be exposed + # to Vault in the path `/vault/userconfig//`. + # These reflect the Kubernetes vault and ca secrets created + extraVolumes: + - type: secret + name: tls-server + - type: secret + name: tls-ca + + standalone: + enabled: false + + # Run Vault in "HA" mode. + ha: + enabled: true + replicas: 3 + config: | + ui = true + + listener "tcp" { + tls_disable = 0 + address = "0.0.0.0:8200" + tls_cert_file = "/vault/userconfig/tls-server/tls.crt" + tls_key_file = "/vault/userconfig/tls-server/tls.key" + tls_min_version = "tls12" + } + storage "consul" { + path = "vault" + address = "consul-consul-server:8500" + } + +# Vault UI +ui: + enabled: true + serviceType: "LoadBalancer" + serviceNodePort: null + externalPort: 8200 + +``` + +Then run the installation: + +``` +helm install vault hashicorp/vault -n vault -f vault-values.yaml + +``` + +As a result, several pods get created: + +``` +kubectl get pods -n vault +NAME READY STATUS RESTARTS AGE +consul-consul-client-655fq 1/1 Running 0 104s +consul-consul-client-dkngt 1/1 Running 0 104s +consul-consul-client-nnbnl 1/1 Running 0 104s +consul-consul-connect-injector-8447d8d97b-8hkj8 1/1 Running 0 104s +consul-consul-server-0 1/1 Running 0 104s +consul-consul-webhook-cert-manager-7c4ccbdd4c-d89bw 1/1 Running 0 104s +vault-0 1/1 Running 0 23s +vault-1 1/1 Running 0 23s +vault-2 1/1 Running 0 23s +vault-agent-injector-6c7cfc768-kv968 1/1 Running 0 23s + +``` + +Sealing and unsealing the Vault[](#sealing-and-unsealing-the-vault "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Right after the installation, Vault server starts in a *sealed* state. It knows where and how to access the physical storage but, by design, it is lacking the key to decrypt any of it. The only operations you can do when Vault is sealed are to + +> * unseal Vault and +> * check the status of the seal. + +The reverse process, called *unsealing*, consists of creating the plaintext root key necessary to read the decryption key. + +In real life, there would be an administrator who could first generate the so-called *key shares* or *unseal keys*, which is a set of exactly **five** text strings. Then they would disperse these keys to two or more people, so that the secrets would be hard to gather for a potential attacker. And to perform the unsealing, at least three out of those five strings would have to be presented to the Vault, in any order. + +In this article, however, you are both the administrator and the user and can set up things your way. First you will + +> * generate the keys and have them available in plain sight and then you will +> * enter three out of those five strings back to the system. + +You will have a limited but sufficient amount of time to enter the keys; the value *livenessProbe* in file **vault-values.yaml** is 360 seconds, which will give you ample time to enter the keys. + +At the end of the article we show how to interactively set it to **60** seconds, so that the cluster can check health of the pods more frequently. + +Step 5 Unseal Vault[](#step-5-unseal-vault "Permalink to this headline") +------------------------------------------------------------------------- + +Three nodes in the Kubernetes cluster represent Vault and are named *vault-0*, *vault-1*, *vault-2*. To make the Vault functional, you will have to unseal all three of them. + +To start, enter the container in *vault-0*: + +``` +kubectl -n vault exec -it vault-0 -- sh + +``` + +Then from inside the pod, get the keys: + +``` +vault operator init + +``` + +The result will be the following, you will get the 5 unseal keys and a root token. Save these keys to Notepad, so you have convenient access to them later: + +``` +Unseal Key 1: jcJj2ukVBNG5K01PX3UkskPotc+tGAvalG5CqBveS6LN +Unseal Key 2: OBzqfTYL9lmmvuewk85kPxpgc0D/CDVXrY9cdBElA3hJ +Unseal Key 3: M6QysiGixui4SlqB7Jdgv0jaHn8m45V91iabrxRvNo6v +Unseal Key 4: H7T5BHR2isbBSHfu2q4aKG0hvvA13uXlT9799whxmuL+ +Unseal Key 5: rtbXv3TqdUeN3luelJa8OOI/CKlILANXxFVkyE/SKv4c + +Initial Root Token: s.Pt7xVk5rShSuIJqRPqBFWY5H + +``` + +Then, from within the pod *vault-0*, unseal it by typing: + +``` +vault operator unseal + +``` + +You will get prompted for the key, then paste key 1 from your notepad. Repeat this process 3 times in the *vault-0* pod, each time providing a different key out of those five you have just generated. + +This is what the entire process looks like: + +![unsealing_the_pod.png](../_images/unsealing_the_pod.png) + +In third attempt, the values change to **Initialized** to be **true** and **sealed** to be **false**: + +``` +Key Value +--- ----- +Seal Type shamir +Initialized true +Sealed false +... ... + +``` + +The pod is unsealed. + +**Now repeat the same process for** *vault-1* **and** *vault-2* **pods**. + +To stop using the console in *vault-0*, press Ctrl-D on keyboard. Then enter *vault-1* with command + +``` +kubectl -n vault exec -it vault-1 -- sh + +``` + +and unseal it by entering at least three keys. Then the similar procedure for *vault-2*. Only when all three pods are unsealed will the Vault become active. + +Step 6 Run Vault UI[](#step-6-run-vault-ui "Permalink to this headline") +------------------------------------------------------------------------- + +With our configuration, Vault UI is exposed on port 8200 of a dedicated LoadBalancer that got created. + +To check the LoadBalancer, run: + +``` +kubectl -n vault get svc + +``` + +Check the external IP of the LoadBalancer (it could take a couple of minutes when external IP is available): + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +... +vault-ui LoadBalancer 10.254.49.9 64.225.129.145 8200:32091/TCP 143m + +``` + +Type the external IP to the browser, specifying HTTPS and port 8200. The site may ask you for the certificate and can complain that there is a risk of proceeding. You should accept all the risks and see that Vault UI is available, similar to the image below. To login, provide the token which you obtained earlier: + +![vault_created.png](../_images/vault_created.png) + +You can now start using the Vault. + +![start_using_vault.png](../_images/start_using_vault.png) + +Return livenessProbe to production value[](#return-livenessprobe-to-production-value "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +*livenessProbe* in Kubernetes is time in which the system checks the health of the nodes. That would normally not be a concern of yours but if you do not unseal the Vault within that amount of time, the unsealing won’t work. Under normal circumstances, the value would be **60** seconds so that in case of any disturbance, the system would react within one minute instead of six. But it is very hard to copy and enter three strings under one minute as would happen if the value of **60** were present in file **vault-values.yaml**. You would almost inevitably see Kubernetes error **137**, meaning that you did not perform the required operations in time. + +In file **vault-values.yaml** the following section defined **360** seconds as the time for activating the *livenessProbe*: + +``` +livenessProbe: + enabled: true + path: "/v1/sys/health?standbyok=true" + initialDelaySeconds: 360 + +``` + +To return the value of *livenessProbe* to **60**, execute the command: + +``` +kubectl edit statefulset vault -n vault + +``` + +You can now access the equivalent of file **vault-values.yaml** inside the Kubernetes cluster. The command will automatically enter a Vim-like editor so press the **O** key on the keyboard in order to be able to change the value with it: + +![vim_editor_change.png](../_images/vim_editor_change.png) + +When done, save and leave Vim with the standard **:w** and **:q** syntax. + +Troubleshooting[](#troubleshooting "Permalink to this headline") +----------------------------------------------------------------- + +Check the events, which can point out hints of what needs to be improved: + +``` +kubectl get events -n vault + +``` + +If there are errors and you want to delete Vault installation in order to repeat the process from a clean slate, note that **MutatingWebhookConfiguration** might be left in the default namespace. Delete it prior to trying again: + +``` +kubectl get MutatingWebhookConfiguration + +kubectl delete MutatingWebhookConfiguration consul-consul-connect-injector +kubectl delete MutatingWebhookConfiguration vault-agent-injector-cfg + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Now you have Vault server as a part of the cluster and you can also use it from the IP address it got installed to. + +Another way to improve Kubernetes security is securing applications with HTTPS using ingress: + +[Deploying HTTPS Services on Magnum Kubernetes in CloudFerro Cloud Cloud](Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html). \ No newline at end of file diff --git a/docs/kubernetes/Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md b/docs/kubernetes/Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md new file mode 100644 index 0000000..4ebd1da --- /dev/null +++ b/docs/kubernetes/Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html.md @@ -0,0 +1,188 @@ +Installing JupyterHub on Magnum Kubernetes Cluster in CloudFerro Cloud Cloud[](#installing-jupyterhub-on-magnum-kubernetes-cluster-in-brand-name-cloud-name-cloud "Permalink to this headline") +================================================================================================================================================================================================ + +Jupyter notebooks are a popular method of presenting application code, as well as running exploratory experiments and analysis, conveniently, from a web browser. From a Jupyter notebook, one can run code, see the generated results in attractive visual form, and often also interactively interact with the generated output. + +JupyterHub is an open-source service that creates cloud-based Jupyter notebook servers, on-demand, enabiling users to run their notebooks without being concerned about the setup and required resources. + +It is straightforward to quickly deploy JupyterHub using Magnum Kubernetes service, which we present in this article. + +What We are Going to Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Authenticate to the cluster +> * Run Jupyterhub Helm chart installation +> * Retrieve details of Jupyterhub service +> * Run Jupyterhub on HTTPS + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **kubectl up and running** + +For further instructions refer to [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +No. 3 **Helm up and running** + +Helm is package manager for Kubernetes as explained in article + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 4 **A registered domain name available** + +To see the results of the installation, you should have a registered domain of your own. You will use it in Step 5 to run JupyterHub on HTTPS in a browser. + +Step 1 Authenticate to the cluster[](#step-1-authenticate-to-the-cluster "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +First of all, we need to authenticate to the cluster. It may so happen that you already have a cluster at your disposal and that the config file is already in place. In other words, you are able to execute the **kubectl** command immediately. + +You may also create a new cluster and call it, say, *jupyter-cluster*, as explained in Prerequisite No. 2. In that case, run from your local machine the following command to create config file in the present working directory: + +``` +openstack coe cluster config jupyter-cluster + +``` + +This will output the command to set the KUBECONFIG *env*, which is a variable pointing to the location of your newly created cluster e.g. + +``` +export KUBECONFIG=/home/eouser/config + +``` + +Run this command. + +Step 2 Apply preliminary configuration[](#step-2-apply-preliminary-configuration "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------- + +OpenStack Magnum by default applies certain security restrictions for pods running on the cluster, in line with “least privileges” practice. JupyterHub will require some additional privileges in order to run correctly. + +We will start by creating a dedicated namespace for our JupyterHub Helm artifacts: + +``` +kubectl create namespace jupyterhub + +``` + +The next step is to create a *RoleBinding* that will add a *magnum:podsecuritypolicy:privileged* ClusterRole to the ServiceAccount which will be later deployed by JupyterHub Helm chart in the *jupyterhub* namespace. This role will enable additional privileges to this Service Account. Create a file *jupyterhub-rolebinding.yaml* with the following contents: + +**jupyterhub-rolebinding.yaml** + +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: jupyterhub-rolebinding + namespace: jupyterhub +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: magnum:podsecuritypolicy:privileged + +``` + +Then apply with: + +``` +kubectl apply -f jupyterhub-rolebinding.yaml + +``` + +Step 3 Run Jupyterhub Helm chart installation[](#step-3-run-jupyterhub-helm-chart-installation "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +To install Helm chart with the default settings use the below set of commands. This will + +> * download and update the JupyterHub repository, and +> * install the chart to the *jupyterhub* namespace. + +``` +helm repo add jupyterhub https://hub.jupyter.org/helm-chart/ +helm repo update +helm install jupyterhub jupyterhub/jupyterhub --version 2.0.0 --namespace jupyterhub + +``` + +This is the result of successful Helm chart installation: + +![installation_done.png](../_images/installation_done.png) + +Step 4 Retrieve details of your service[](#step-4-retrieve-details-of-your-service "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +Once all the Helm resources get deployed to the *jupyterhub* namespace, we can view their state and definitions using standard **kubectl** commands. + +To view the services resource created by Helm, execute the following command: + +``` +kubectl get services -n jupyterhub + +``` + +There are several resources created and a few services. The one most interesting to us is the proxy-public service of type LoadBalancer, which exposes JupyterHub to the public network: + +``` +$ kubectl get services -n jupyterhub +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +hub ClusterIP 10.254.209.133 8081/TCP 18d +proxy-api ClusterIP 10.254.86.239 8001/TCP 18d +proxy-public LoadBalancer 10.254.168.141 64.225.131.136 80:31027/TCP 18d + +``` + +The External IP of the proxy-public service will be initially in ** state. Refresh this command and after 2-5 minutes, you will see the floating IP assigned to the service. You can then type this IP into the browser. + +First, you will enter the login screen. Provide any combination of dummy login and password, after a moment JupyterHub gets loaded into the browser: + +![image2023-1-13_13-6-5.png](../_images/image2023-1-13_13-6-5.png) + +JupyterHub is now working on HTTP and a direct IP address and you can use it as is. + +Warning + +If in the next step you start running a JupyterHub on HTTPS, you will not be able to run it as a HTTP service unless it has been relaunched. + +Step 5 Run on HTTPS[](#step-5-run-on-https "Permalink to this headline") +------------------------------------------------------------------------- + +JupyterHub Helm chart enables HTTPS deployments natively. Once we deployed the chart above, we can simply upgrade the chart to enable serving it on HTTPS. Under the hood, it will generate the certificates using Let’s Encrypt certificate authority. + +In order to do enable HTTPS, prepare a file for the configuration override e.g. *jupyter-https-values.yaml* with the following contents (adjust the email and domain to your own): + +**jupyter-https-values.yaml** + +``` +proxy: + https: + enabled: true + hosts: + - mysampledomain.info + letsencrypt: + contactEmail: [email protected] + +``` + +Then upgrade the chart with the following **upgrade** command: + +``` +helm upgrade -n jupyterhub jupyterhub jupyterhub/jupyterhub -f jupyter-https-values.yaml + +``` + +As noted in Prerequisite No. 4, you should have an available registered domain so that you can now point it to address that the LoadBalancer for service **proxy-public** returned above. Please ensure that the records in your domain registrar are correctly associated. Concretely, we’ve associated the A record set of *mysampledomain.info* with the record **64.225.131.136** (the public IP address or our service). Once this is done, the JupyterHub gets served on HTTPS: + +![image2023-2-6_15-25-4.png](../_images/image2023-2-6_15-25-4.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +For the production environment: replace the dummy authenticator with an alternative authentication mechanism, ensure persistence by e.g. connecting to a Postgres database. These steps are beyond the scope of this article. \ No newline at end of file diff --git a/docs/kubernetes/Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html.md b/docs/kubernetes/Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..59817f7 --- /dev/null +++ b/docs/kubernetes/Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html.md @@ -0,0 +1,212 @@ +Kubernetes cluster observability with Prometheus and Grafana on CloudFerro Cloud[](#kubernetes-cluster-observability-with-prometheus-and-grafana-on-brand-name "Permalink to this headline") +============================================================================================================================================================================================= + +Complex systems deployed on Kubernetes take advantage of multiple Kubernetes resources. Such deployments often consist of a number of namespaces, pods and many other entities, which contribute to consuming the cluster resources. + +To allow proper insight into how the cluster resources are utilized, and enable optimizing their use, one needs a functional cluster observability setup. + +In this article we will present the use of a popular open-source observability stack consisting of Prometheus and Grafana. + +What Are We Going To Cover[](#what-are-we-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install Prometheus +> * Install Grafana +> * Access Prometheus as datasource to Grafana +> * Add cluster observability dashboard + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **A cluster created on** **cloud** + +Kubernetes cluster available. For guideline on creating a Kubernetes cluster refer to [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 3 **Familiarity with Helm** + +For more information on using Helm and installing apps with Helm on Kubernetes, refer to [Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 4 **Access to kubectl command line** + +The instructions for activation of **kubectl** are provided in: [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +1. Install Prometheus with Helm[](#install-prometheus-with-helm "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +Prometheus is an open-source monitoring and alerting toolkit, widely used in System Administration and DevOps domains. Prometheus comes with a timeseries database, which can store metrics generated by variety of other systems and software tools. It provides a query language called PromQL to efficiently access this data. In our case, we will use Prometheus to get access to the metrics generated by our Kubernetes cluster. + +We will use the Prometheus distribution delivered via the Bitnami, so the first step is to download Bitnami to our local Helm repository cache. To do so, type in the following command: + +``` +helm repo add bitnami https://charts.bitnami.com/bitnami + +``` + +Next, download the Prometheus Helm chart: + +``` +helm install prometheus bitnami/kube-prometheus + +``` + +With the above commands correctly applied, the result should be similar to the following: + +``` +NAME: prometheus +LAST DEPLOYED: Thu Nov 2 09:22:38 2023 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +CHART NAME: kube-prometheus +CHART VERSION: 8.21.2 +APP VERSION: 0.68.0 + +``` + +Note that we are deploying the Helm chart to the default namespace for simplicity. For production, you might consider using a dedicated namespace. + +Behind the scenes, several Prometheus pods are launched by the chart, which can be verified as follows: + +``` +kubectl get pods + +... + +NAME READY STATUS RESTARTS AGE +alertmanager-prometheus-kube-prometheus-alertmanager-0 2/2 Running 0 2m39s +prometheus-kube-prometheus-blackbox-exporter-5cf8597545-22wxc 1/1 Running 0 2m51s +prometheus-kube-prometheus-operator-69584c98f-7wwrg 1/1 Running 0 2m51s +prometheus-kube-state-metrics-db4f67c5c-h77lb 1/1 Running 0 2m51s +prometheus-node-exporter-8twzf 1/1 Running 0 2m51s +prometheus-node-exporter-sc8d7 1/1 Running 0 2m51s +prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 0 2m39s + +``` + +Similarily, several dedicated Kubernetes services are also deployed. The service *prometheus-kube-prometheus-prometheus* exposes the Prometheus dashboard. To access this service in the browser on default port 9090, type in the following command: + +``` +kubectl port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090 + +``` + +Then access your browser via *localhost:9090* to see the result similar to the following: + +![image2023-11-7_13-17-10.png](../_images/image2023-11-7_13-17-10.png) + +Notice, when you start typing kube in the search results, the autocomplete suggest some of the metrics that are available from our Kubernetes cluster. Along with the Helm chart installation, these metrics got exposed to Prometheus, so they are stored in Prometheus database and can be queried for. + +![image2023-11-7_13-22-56.png](../_images/image2023-11-7_13-22-56.png) + +You can select one of the metrics and hit **Execute** button to process the query for statistics of this metrics. For example, insert the following expression + +``` +kube_pod_info{namespace="default"} + +``` + +to query for all pods in the default namespace. (Further elaboration about the capabilities of Prometheus GUI and PromQL syntax is beyond the scope of this article.) + +![image2023-11-7_13-40-1.png](../_images/image2023-11-7_13-40-1.png) + +2. Install Grafana[](#install-grafana "Permalink to this headline") +-------------------------------------------------------------------- + +The next step is to install Grafana. We already added the Bitnami repository when installing Prometheus, so Grafana repository was also added to our local cache. We only need to install Grafana. + +Note that if you want to keep an active browser session of Prometheus from the previous step, you will need to start another Linux terminal to proceed with the below installation guideline. + +By default, Grafana chart will be installed with a random auto-generated admin password. We can overwrite one of the Helm settings to define our own password, in this case: *ownpassword*, for simplicity of the demo: + +``` +helm install grafana bitnami/grafana --set admin.password=ownpassword + +``` + +If you prefer to stick to the defaults, instead of the above command, use the following commands to install the chart and extract the auto-generated password: + +``` +helm install grafana bitnami/grafana +echo "Password: $(kubectl get secret grafana-admin --namespace default -o jsonpath="{.data.GF_SECURITY_ADMIN_PASSWORD}" | base64 -d)" + +``` + +There will be a single pod generated by the chart installation. Ensure to wait until this pod is ready before proceeding with the further steps: + +``` +kubectl get pods + +NAME READY STATUS RESTARTS AGE +... +grafana-fb6877dbc-5jvjc 1/1 Running 0 65s +... + +``` + +Now, similarly as with Prometheus we can access Grafana dashboard locally in the browser via the port-forward command: + +``` +kubectl port-forward svc/grafana 8080:3000 + +``` + +Then access the Grafana dashboard by entering *localhost:8080* in the browser: + +![image2023-11-7_14-24-1.png](../_images/image2023-11-7_14-24-1.png) + +Type the login: *admin* and the password *ownpassword* (or the auto-generated password you extracted in the earlier step). + +3. Add Prometheus as datasource to Grafana[](#add-prometheus-as-datasource-to-grafana "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------- + +In this step we will setup Grafana to use our Prometheus installation as a datasource. + +To proceed, click on **Home** menu in the left upper corner of Grafana UI, select **Connections** and then **Data sources**: + +![image2023-11-7_14-47-56.png](../_images/image2023-11-7_14-47-56.png) + +Then select **Add data source** and choose *Prometheus* as datasource type. You will enter the following screen: + +![image2023-11-7_14-54-8.png](../_images/image2023-11-7_14-54-8.png) + +Just change “Prometheus server URL” field to which represents the address of the Prometheus Kubernetes service in charge of exposing the metrics. + +Hit the **Save and test** button. If all went well, you will see the following screen: + +![image2023-11-7_15-1-59.png](../_images/image2023-11-7_15-1-59.png) + +4. Add cluster observability dashboard[](#add-cluster-observability-dashboard "Permalink to this headline") +------------------------------------------------------------------------------------------------------------ + +We could be building a Kubernetes observability dashboard from the scratch, but we will much rather utilize one of the open-source dashboards already available. + +To proceed, select the Dashboards section from the collapsible menu in top left corner and click **Import**: + +![image2023-11-7_15-15-23.png](../_images/image2023-11-7_15-15-23.png) + +Then in the *import via grafana.com* field, enter **10000**, which is the ID of the Kubernetes observability dashboard from the *grafana.com* marketplace represented in: + +![image2023-11-7_15-16-10.png](../_images/image2023-11-7_15-16-10.png) + +Then another screen appears as per below. Change data source to Prometheus and hit **Import** button: + +![importdashboard.png](../_images/importdashboard.png) + +As the result, the Grafana Kubernetes observability dashboard gets populated: + +![image2023-11-7_15-38-40.png](../_images/image2023-11-7_15-38-40.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can find and import many other dashboards for Kubernetes observability by browsing . Some examples are dashboards with IDs: 315, 15758, 15761 or many more. + +The following article shows another approach to creating a Kubernetes dashboard: + +[Using Dashboard To Access Kubernetes Cluster Post Deployment On CloudFerro Cloud OpenStack Magnum](Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html) \ No newline at end of file diff --git a/docs/kubernetes/Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html.md b/docs/kubernetes/Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html.md new file mode 100644 index 0000000..7743da1 --- /dev/null +++ b/docs/kubernetes/Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html.md @@ -0,0 +1,380 @@ +Private container registries with Harbor on CloudFerro Cloud Kubernetes[](#private-container-registries-with-harbor-on-brand-name-kubernetes "Permalink to this headline") +=========================================================================================================================================================================== + +A fundamental component of the container-based ecosystem are *container registries*, used for storing and distributing container images. There are a few popular public container registries, which serve this purpose in a software-as-a-service model and the most popular is [DockerHub](https://hub.docker.com/). + +In this article, we are using [Harbor](https://goharbor.io/), which is a popular open-source option for running private registries. It is compliant with [OCI (Open Container Initiative](https://opencontainers.org/)), which makes it suitable to work with standard container images. It ships with multiple enterprise-ready features out of the box. + +Benefits of using your own private container registry[](#benefits-of-using-your-own-private-container-registry "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------- + +When you **deploy your own private container registry**, the benefits would be, amongst others: + +> * full control of the storage of your images and the way of accessing them +> * privacy for proprietary and private images +> * customized configuration for logging, authentication etc. + +You can also use *Role-based access control* on Harbor project level to specify and enforce which users have permission to publish updated images, to consume the available ones and so on. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Deploy Harbor private registry with Bitnami-Harbor Helm chart +> * Access Harbor from browser +> * Associate the A record of your domain to Harbor’s IP address +> * Create a project in Harbor +> * Create a Dockerfile for our custom image +> * Ensure trust from our local Docker instance +> * Build our image locally +> * Upload a Docker image to your Harbor instance +> * Download a Docker image from your Harbor instance + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **A cluster on CloudFerro-Cloud cloud** + +A Kubernetes cluster on CloudFerro Cloud cloud. Follow guidelines in this article [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +No. 3 **kubectl operational** + +**kubectl** CLI tool installed and pointing to your cluster via KUBECONFIG environment variable. Article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) provides further guidance. + +No. 4 **Familiarity with deploying Helm charts** + +See this article: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 5 **Domain purchased from a registrar** + +You should own a domain, purchased from any registrar (domain reseller). Obtaining a domain from registrars is not covered in this article. + +No. 6 **Use DNS service in Horizon to link Harbor service to the domain name** + +This is optional. Here is the article with detailed information: + +[DNS as a Service on CloudFerro Cloud Hosting](../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html) + +No. 7 **Docker installed on your machine** + +See [How to install and use Docker on Ubuntu 24.04](../cloud/How-to-use-Docker-on-CloudFerro-Cloud.html). + +Deploy Harbor private registry with Bitnami-Harbor Helm chart[](#deploy-harbor-private-registry-with-bitnami-harbor-helm-chart "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +The first step to deploy Harbor private registry is to create a dedicated namespace to host Harbor artifacts: + +``` +kubectl create ns harbor + +``` + +Then we add Bitnami repository to Helm: + +``` +helm repo add bitnami https://charts.bitnami.com/bitnami + +``` + +We will then prepare a configuration file, which we can use to control various parameters of our deployment. If you want to have a view of all possible configuration parameters, you can download the default configuration *values.yaml*: + +``` +helm show values bitnami/harbor > values.yaml + +``` + +You can then see the configuration parameters with + +``` +cat values.yaml + +``` + +Otherwise to proceed with the article, use *nano* editor to create new file **harbor-values.yaml** + +``` +nano harbor-values.yaml + +``` + +and paste the following contents: + +``` +externalURL: mysampledomain.info +nginx: + tls: + commonName: mysampledomain.info +adminPassword: Harbor12345 + +``` + +These settings deploy Harbor portal as a service of LoadBalancer type, and the SSL termination is delegated to NGINX that gets deployed along as a Kubernetes pod. + +Warning + +We use mysampledomain.info for demonstration purposes only. Please replace this with a real domain you own while running the code in this article. + +For demonstration we also use a simple password, which can be replaced after the initial login. + +Now install the chart with the following command: + +``` +helm install harbor bitnami/harbor --values harbor-values.yaml -n harbor + +``` + +The output should be similar to the following: + +``` +NAME: harbor +LAST DEPLOYED: Tue Aug 1 15:48:44 2023 +NAMESPACE: harbor-bitnami +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +CHART NAME: harbor +CHART VERSION: 16.6.5 +APP VERSION: 2.8.1 + +** Please be patient while the chart is being deployed ** + +1. Get the Harbor URL: + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace harbor-bitnami -w harbor' + export SERVICE_IP=$(kubectl get svc --namespace harbor-bitnami harbor --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") + echo "Harbor URL: http://$SERVICE_IP/" + +2. Login with the following credentials to see your Harbor application + + echo Username: "admin" + echo Password: $(kubectl get secret --namespace harbor-bitnami harbor-core-envvars -o jsonpath="{.data.HARBOR_ADMIN_PASSWORD}" | base64 -d) + +``` + +Access Harbor from browser[](#access-harbor-from-browser "Permalink to this headline") +--------------------------------------------------------------------------------------- + +With the previous steps followed, you should be able to access the Harbor portal. The following command will display all of the services deployed: + +``` +kubectl get services -n harbor + +``` + +Here they are: + +``` +$ kubectl get services -n harbor-bitnami +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +harbor LoadBalancer 10.254.208.73 64.225.133.148 80:32417/TCP,443:31448/TCP,4443:31407/TCP 4h2m +harbor-chartmuseum ClusterIP 10.254.11.204 80/TCP 4h2m +harbor-core ClusterIP 10.254.209.231 80/TCP 4h2m +harbor-jobservice ClusterIP 10.254.228.203 80/TCP 4h2m +harbor-notary-server ClusterIP 10.254.189.61 4443/TCP 4h2m +harbor-notary-signer ClusterIP 10.254.81.205 7899/TCP 4h2m +harbor-portal ClusterIP 10.254.217.77 80/TCP 4h2m +harbor-postgresql ClusterIP 10.254.254.0 5432/TCP 4h2m +harbor-postgresql-hl ClusterIP None 5432/TCP 4h2m +harbor-redis-headless ClusterIP None 6379/TCP 4h2m +harbor-redis-master ClusterIP 10.254.137.87 6379/TCP 4h2m +harbor-registry ClusterIP 10.254.2.234 5000/TCP,8080/TCP 4h2m +harbor-trivy ClusterIP 10.254.249.99 8080/TCP 4h2m + +``` + +Explaining the purpose of several artifacts is beyond the scope of this article. The key service that is interesting to us at this stage is *harbor*, which got deployed as LoadBalancer type with public IP **64.225.134.148**. + +Associate the A record of your domain to Harbor’s IP address[](#associate-the-a-record-of-your-domain-to-harbor-s-ip-address "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------- + +The final step is to associate the A record of your domain to the Harbor’s IP address. + +Create or edit the A record through your domain registrar +: The exact steps will vary from one registrar to another so explaining them is out of scope of this article. + +Create or edit the A record through the DNS as a service available in your CloudFerro Cloud account +: This is explained in Prerequisite No. 6. Use commands **DNS** –> **Zones** and select the name of the site you are using instead of *mysampledomain.info*, then click on **Record Sets**. In column **Type**, there will be type **A - Address record** and click on **Update** field on the right side to enter or change the value in that row: + +![image2023-8-2_16-7-51.png](../_images/image2023-8-2_16-7-51.png) + +In this screenshot, the value **64.225.134.148** is already entered into that **Update** field – you will, of course, here supply your own IP value instead. + +With the above steps completed, you can access *harbor* from the expected URL, in our case: . Since the chart generated self-signed certificates, you will first need to accept the “Not Secure” warning provided by the browser: + +![image2023-8-2_16-11-43.png](../_images/image2023-8-2_16-11-43.png) + +Note + +This warning will vary from one browser to another. + +To log in to your instance, use these as the login details + +> | | | +> | --- | --- | +> | login | admin | +> | password | Harbor12345 | + +Create a project in Harbor[](#create-a-project-in-harbor "Permalink to this headline") +--------------------------------------------------------------------------------------- + +When you log in to Harbor, you enter the **Projects** section: + +![image2023-8-2_16-36-11.png](../_images/image2023-8-2_16-36-11.png) + +A *project* in Harbor is a separate space where containers can be placed. An image needs to be placed in a scope of a specific project. As a Harbor admin, you can also apply **Role-Based Access Control** on the Harbor project level, so that only specific users can access or perform certain operations within a scope of a given project. + +To create a new project, click on **New Project** button. In this article, we will upload a public image that can be accessed by anyone, and let it be called simply *myproject*: + +![image2023-8-2_16-44-28.png](../_images/image2023-8-2_16-44-28.png) + +Create a Dockerfile for our custom image[](#create-a-dockerfile-for-our-custom-image "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +The Harbor service is running and we can use it to upload our Docker images. We will generate a minimal image, so just create an empty folder, called *helloharbor*, with a single Docker file (called *Dockerfile*) + +**Dockerfile** + +``` +mkdir helloharbor +cd helloharbor +nano Dockerfile + +``` + +and its contents be: + +``` +FROM alpine +CMD ["/bin/sh", "-c", "echo 'Hello Harbor!'"] + +``` + +Ensure trust from our local Docker instance[](#ensure-trust-from-our-local-docker-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +In order to build our Docker image in further steps and upload this image to Harbor, we need to ensure communication of our local Docker instance with Harbor. To fulfill this objective, proceed as follows: + +### Ensure Docker trust - Step 1. Bypass Docker validating the domain certificate[](#ensure-docker-trust-step-1-bypass-docker-validating-the-domain-certificate "Permalink to this headline") + +Bypass Docker validating the domain certificate pointing to the domain where Harbor is running. Docker would not trust this certificate, because it is self-signed. To bypass this validation, create a file called *daemon.json* in */etc/docker* directory on your local machine: + +``` +sudo chmod 777 /etc/docker + +``` + +You are using **sudo** so will be asked to supply the password. Now create the file: + +``` +nano /etc/docker/daemon.json + +``` + +and fill in with this content, then save with **Ctrl-X, Y**: + +``` +{ + "insecure-registries" : [ "mysampledomain.info" ] +} + +``` + +As always, replace *mysampledomain.info* with your own domain. + +For production, you would rather set up proper HTTPS certificate for the domain. + +### Ensure Docker trust - Step 2. Ensure Docker trusts the Harbor’s Certificate Authority[](#ensure-docker-trust-step-2-ensure-docker-trusts-the-harbor-s-certificate-authority "Permalink to this headline") + +To do so, we download the **ca.crt** file from our Harbor portal instance from the **myproject** project view: + +![image2023-8-3_14-41-56.png](../_images/image2023-8-3_14-41-56.png) + +The exact way of installing the certificate will depend on the environment you are running Docker on: + +Install the certificate on Linux +: Create a nested directory path */etc/docker/certs.d/mysampledomain.info* and to this folder upload the **ca.crt** file: + + ``` + sudo mkdir -p /etc/docker/certs.d/mysampledomain.info + sudo cp ~/ca.crt /etc/docker/certs.d/mysampledomain.info + + ``` + +Install the certificate on WSL2 running on Windows 10 or 11 +: In WSL2, you would need to upload the certificate to Windows ROOT CA store with the following sequence: + + > * Click on Start and type **Manage Computer Certificates** + > * Right-click on **Trusted Root Certification Authorities** then **All tasks** and **Import** + > * Browse to the *ca.crt* file location and then keep pressing **Next** to complete the wizard + > * Restart Docker from Docker Desktop menu + +### Ensure Docker trust - Step 3. Restart Docker[](#ensure-docker-trust-step-3-restart-docker "Permalink to this headline") + +Restart Docker with: + +``` +sudo systemctl restart docker + +``` + +Build our image locally[](#build-our-image-locally "Permalink to this headline") +--------------------------------------------------------------------------------- + +After these steps, we can tag our image and build it locally (from the location where Dockerfile is placed): + +``` +docker build -t mysampledomain.info/myproject/helloharbor . + +``` + +Next we can log in to the Harbor portal with our *admin* login and *Harbor12345* password: + +``` +docker login mysampledomain.info + +``` + +Upload a Docker image to your Harbor instance[](#upload-a-docker-image-to-your-harbor-instance "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +Lastly, push the image to the repo: + +``` +docker push mysampledomain.info/myproject/helloharbor + +``` + +The result will be similar to the following: + +![image2023-8-3_15-11-48.png](../_images/image2023-8-3_15-11-48.png) + +Download a Docker image from your Harbor instance[](#download-a-docker-image-from-your-harbor-instance "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------- + +To demonstrate downloading images from our Harbor repository, we can first delete the local Docker image we created earlier. + +``` +docker image rm mysampledomain.info/myproject/helloharbor + +``` + +To verify, view it is not on our local images list: + +``` +docker images + +``` + +Then pull from Harbor remote: + +``` +docker pull mysampledomain.info/myproject/helloharbor + +``` \ No newline at end of file diff --git a/docs/kubernetes/Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html.md b/docs/kubernetes/Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html.md new file mode 100644 index 0000000..68d3f00 --- /dev/null +++ b/docs/kubernetes/Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html.md @@ -0,0 +1,177 @@ +Sealed Secrets on CloudFerro Cloud Kubernetes[](#sealed-secrets-on-brand-name-kubernetes "Permalink to this headline") +======================================================================================================================= + +Sealed Secrets improve security of our Kubernetes deployments by enabling encrypted Kubernetes secrets. This allows to store such secrets in source control and follow GitOps practices of storing all configuration in code. + +In this article we will install tools to work with Sealed Secrets and demonstrate using Sealed Secrets on CloudFerro Cloud cloud. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Install the Sealed Secrets controller +> * Install the **kubeseal** command line utility +> * Create a sealed secret +> * Unseal the secret +> * Verify + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Understand Helm deployments** + +To install Sealed Secrets on Kubernetes cluster, we will use the appropriate Helm chart. The following article explains the procedure: + +[Deploying Helm Charts on Magnum Kubernetes Clusters on CloudFerro Cloud Cloud](Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html) + +No. 3 **Kubernetes cluster** + +General explanation of how to create a Kubernetes cluster is here: + +[How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html) + +For new cluster, using the latest version of the cluster template is always recommended. This article was tested with Kubernetes 1.25. + +No. 4 **Access to cluster with kubectl** + +[How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +Step 1 Install the Sealed Secrets controller[](#step-1-install-the-sealed-secrets-controller "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +In order to use Sealed Secrets we will first install the Sealed Secrets controller to our Kubernetes cluster. We can use Helm for this purpose and the first step is to download the Helm repository. To add the repo locally use the following command: + +``` +helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets + +``` + +The next step is to install the SealedSecrets controller chart. We need to install it to the namespace **kube-system**. Note we also override the name of the controller, so that it corresponds to the default name used by the CLI utility **kubeseal** which we will install in the following section. + +``` +helm install sealed-secrets -n kube-system --set-string fullnameOverride=sealed-secrets-controller sealed-secrets/sealed-secrets + +``` + +The chart downloads several resources to our cluster. The key ones are: + +> * **SealedSecret Custom Resource Definition (CRD)** - defines the template for sealed secrets that will be created on the cluster +> * The **SealedSecrets controller pod** running in the kube-system namespace. + +Step 2 Install the kubeseal command line utility[](#step-2-install-the-kubeseal-command-line-utility "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +Kubeseal CLI tool is used for encrypting secrets using the public certificate of the controller. To proceed, install **kubeseal** with the following set of commands: + +``` +KUBESEAL_VERSION='0.23.0' +wget "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION:?}/kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz" +tar -xvzf kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz kubeseal +sudo install -m 755 kubeseal /usr/local/bin/kubeseal + +``` + +You can verify that **kubeseal** was properly installed by running: + +``` +kubeseal --version + +``` + +which will return result similar to the following: + +![image-2024-5-23_17-16-2.png](../_images/image-2024-5-23_17-16-2.png) + +Step 3 Create a sealed secret[](#step-3-create-a-sealed-secret "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +We can use Sealed Secrets to encrypt the secrets, which can be decrypted only by the controller running on the cluster. + +A sealed secret needs to be created based off a regular, unencrypted Kubernetes secret. However, we don’t want to commit this base secret to our Kubernetes cluster. We also do not want to create a permanent file with the unencrypted secret contents, to avoid accidentally committing it to source control. + +Therefore we will use **kubectl** to create a regular secret only temporarily, using **–dry-run=client** parameter. The secret has a key **foo** and value **bar**. **kubectl** outputs this temporary secret, we then pipe this output to **kubeseal** utility. **kubeseal** seals (encrypts) the secret and saves it to a file called **sealed-secret.yaml**. + +``` +kubectl create secret generic mysecret \ +--dry-run=client \ +--from-literal=foo=bar -o yaml | kubeseal \ +--format yaml > mysecret.yaml + +``` + +When we view the file we can see the contents are encrypted and safe to store in source control. + +Step 4 Unseal the secret[](#step-4-unseal-the-secret "Permalink to this headline") +----------------------------------------------------------------------------------- + +To unseal the secret and make it available and usable in the cluster, we perform the following command: + +``` +kubectl create -f mysecret.yaml + +``` + +This, after few seconds, generates a regular Kubernetes secret which is readable to our cluster. We can verify this with these two commands: + +``` +kubectl get secret mysecret -o yaml +echo YmFy | base64 --decode + +``` + +The former command extracts output the yaml of the secret, while the latter decodes the value of the data stored under key **foo** which outputs the expected result: **bar**. + +The results can also be seen on the below screen: + +![image-2024-5-23_17-39-37.png](../_images/image-2024-5-23_17-39-37.png) + +Step 5 Verify[](#step-5-verify "Permalink to this headline") +------------------------------------------------------------- + +The generated secret can be used as a regular Kubernetes secret. To test, create a file **test-pod.yaml** with the following contents: + +**test-pod.yaml** + +``` +apiVersion: v1 +kind: Pod +metadata: + name: nginx +spec: + containers: + - name: nginx + image: nginx:latest + env: + - name: TEST_VAR + valueFrom: + secretKeyRef: + name: mysecret + key: foo + +``` + +This launches a minimal pod called **nginx** which is based on nginx server container image. In the container inside the pod, we create an environment variable called **TEST\_VAR**. The value of the variable is assigned from our secret **mysecret** by the available key **foo**. Apply the example with the following command: + +``` +kubectl apply -f test-pod.yaml + +``` + +Then enter the container inside the **nginx** pod: + +``` +kubectl exec -it nginx -- sh + +``` + +The command prompt will change to **#**, meaning the command you enter is executed inside the container. Execute the **printenv** command to see environment variables. We can see our variable **TEST\_VAR** with the value **bar**, as expected: + +![image-end-of-article.png](../_images/image-end-of-article.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Sealed Secrets present a viable alternative to secret management using additional tools such as HashiCorp-Vault. For additional information, see [Installing HashiCorp Vault on CloudFerro Cloud Magnum](Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html). \ No newline at end of file diff --git a/docs/kubernetes/Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..7c628fe --- /dev/null +++ b/docs/kubernetes/Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,223 @@ +Using Dashboard To Access Kubernetes Cluster Post Deployment On CloudFerro Cloud OpenStack Magnum[](#using-dashboard-to-access-kubernetes-cluster-post-deployment-on-brand-name-openstack-magnum "Permalink to this headline") +=============================================================================================================================================================================================================================== + +After the Kubernetes cluster has been created, you can access it through command line tool, **kubectl**, or you can access it through a visual interface, called the **Kubernetes dashboard**. *Dashboard* is a GUI interface to Kubernetes cluster, much the same as **kubectl** as a CLI interface to the Kubernetes cluster. + +This article shows how to install Kubernetes dashboard. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Deploying the dashboard +> * Creating a sample user +> * Creating secret for admin-user +> * Getting the bearer token for authentication to dashboard +> * Creating a separate terminal window for proxy access +> * Running the dashboard in browser + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Cluster and kubectl should be already operational** + +To eventually set up a cluster and connect it to the **kubectl** tool, see this article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +The important intermediary result of that article is a command like this: + +``` +export KUBECONFIG=/home/user/k8sdir/config + +``` + +Note the exact command which in your case sets up the value of **KUBECONFIG** variable as you will need it to start a new terminal window from which the dashboard will run. + +Step 1 Deploying the Dashboard[](#step-1-deploying-the-dashboard "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +Install it with the following command: + +``` +kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml + +``` + +The result is + +![dashboard_installed.png](../_images/dashboard_installed.png) + +Step 2 Creating a sample user[](#step-2-creating-a-sample-user "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Next, you create a bearer token which will serve as an authorization token for the Dashboard. To that end, you will create two local files and “send” them to the cloud using the **kubectl** command. The first file is called *dashboard-adminuser.yaml* and its contents are + +``` +apiVersion: v1 +kind: ServiceAccount +metadata: + name: admin-user + namespace: kubernetes-dashboard + +``` + +Use a text editor of your choice to create that file, on MacOS or Linux you can use *nano*, like this: + +``` +nano dashboard-adminuser.yaml + +``` + +Install that file on the Kubernetes cluster with this command: + +``` +kubectl apply -f dashboard-adminuser.yaml + +``` + +The second file to create is + +``` +nano dashboard-clusterolebinding.yaml + +``` + +and its contents should be: + +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: admin-user +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: admin-user + namespace: kubernetes-dashboard + +``` + +The command to send it to the cloud is + +``` +kubectl apply -f dashboard-clusterolebinding.yaml + +``` + +Step 3 Create secret for admin-user[](#step-3-create-secret-for-admin-user "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +We have to manually create token for admin user. + +Create file **admin-user-token.yaml** + +``` +nano admin-user-token.yaml + +``` + +Enter the following code: + +``` +apiVersion: v1 +kind: Secret +metadata: + name: admin-user-token + namespace: kubernetes-dashboard + annotations: + kubernetes.io/service-account.name: "admin-user" +type: kubernetes.io/service-account-token + +``` + +Execute it with + +``` +kubectl apply -f admin-user-token.yaml + +``` + +Step 4 Get the bearer token for authentication to dashboard[](#step-4-get-the-bearer-token-for-authentication-to-dashboard "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------- + +The final step is to get the bearer token, which is a long string that will authenticate calls to Dashboard: + +``` +kubectl -n kubernetes-dashboard get secret admin-user-token -o jsonpath="{.data.token}" | base64 --decode + +``` + +The bearer token string will be printed in terminal screen. + +![new-s3cmd-download-69.png](../_images/new-s3cmd-download-69.png) + +Copy it to a text editor, it will be needed after you access the Dashboard UI through a HTTPS call. + +Note + +If the last character of the bearer token string is *%*, it may be a character that denotes the end of the string but is not a part of it. If you copy the bearer string and it is not recognized, try copying it without this ending character *%*. + +Step 5 Create a separate terminal window for proxy access[](#step-5-create-a-separate-terminal-window-for-proxy-access "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------- + +We shall now use a proxy server for Kubernetes API server. The proxy server + +> * handles certificates automatically when accessing Kubernetes API, +> * connects to API extensions or dashboards (like in this article), +> * enables testing of API calls locally before automating them in scripts. + +To enable the connection, start a **separate** terminal window and first set up the config command for that window: + +``` +export KUBECONFIG=/home/user/k8sdir/config + +``` + +*Change that address to point to your own config file on your computer.* + +The next command in that new window is: + +``` +kubectl proxy + +``` + +The server is activated on port **8001**: + +![starting_to_server.png](../_images/starting_to_server.png) + +Step 6 See the dashboard in browser[](#step-6-see-the-dashboard-in-browser "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +Then enter this address into the browser: + +``` +http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ + +``` + +![dashboard2.png](../_images/dashboard2.png) + +Enter the token, click on **Sign In** and get the Dashboard UI for the Kubernetes cluster. + +![dashboard_view.png](../_images/dashboard_view.png) + +The Kubernetes Dashboard organizes working with the cluster in a visual and interactive way. For instance, click on *Nodes* on the left sides to see the nodes that the *k8s-cluster* has. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can still use **kubectl** or alternate with using the **Dashboard**. Either way, you can + +> * deploy apps on the cluster, +> * access multiple clusters, +> * create load balancers, +> * access applications in the cluster using port forwarding, +> * use Service to access application in a cluster, +> * list container images in the cluster +> * use Services, Deployments and all other resources in a Kubernetes cluster. \ No newline at end of file diff --git a/docs/kubernetes/Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..51d6ce3 --- /dev/null +++ b/docs/kubernetes/Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,236 @@ +Using Kubernetes Ingress on CloudFerro Cloud OpenStack Magnum[](#using-kubernetes-ingress-on-brand-name-cloud-name-openstack-magnum "Permalink to this headline") +================================================================================================================================================================== + +The Ingress feature in Kubernetes can be associated with routing the traffic from outside of the cluster to the services within the cluster. With Ingress, multiple Kubernetes services can be exposed using a single Load Balancer. + +In this article, we will provide insight into how Ingress is implemented on the cloud. We will also demonstrate a practical example of exposing Kubernetes services using Ingress on the cloud. In the end, you will be able to create one or more sites and services running on a Kubernetes cluster. The services you create in this way will + +> * run on the same IP address without need of creating extra LoadBalancer per service and will also +> * automatically enjoy all of the Kubernetes cluster benefits – reliability, scalability etc. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Create Magnum Kubernetes cluster with NGINX Ingress enabled +> * Build and expose Nginx and Apache webservers for testing +> * Create Ingress Resource +> * Verify that Ingress can access both testing servers + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Basic knowledge of Kubernetes fundamentals** + +Basic knowledge of Kubernetes fundamentals will come handy: cluster creation, pods, deployments, services and so on. + +No. 3 **Access to kubectl command** + +To install necessary software (if you haven’t done so already), see article [How To Access Kubernetes Cluster Post Deployment Using Kubectl On CloudFerro Cloud OpenStack Magnum](How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html). + +The net result of following instructions in that and the related articles will be + +> * a cluster formed, healthy and ready to be used, as well as +> * enabling access to the cluster from the local machine (i.e. having *kubectl* command operational). + +Step 1 Create a Magnum Kubernetes cluster with NGINX Ingress enabled[](#step-1-create-a-magnum-kubernetes-cluster-with-nginx-ingress-enabled "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +When we create a Kubernetes cluster on the cloud, we can deploy it with a preconfigured ingress setup. This requires minimal setting and is described in this help section: [How to Create a Kubernetes Cluster Using CloudFerro Cloud OpenStack Magnum](How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html). + +Such a cluster is deployed with an NGINX *ingress controller* and the default *ingress backend*. The role of the controller is to enable the provisioning of the infrastructure e.g. the (virtual) load balancer. The role of the backend is to provide access to this infrastructure in line with the rules defined by the **ingress resource** (explained later). + +We can verify the availability of these artifacts by typing the following command: + +``` +kubectl get pods -n kube-system + +``` + +The output should be similar to the one below. We see that there is an ingress controller created, and also an ingress backend, both running as pods on our cluster. + +``` +kubectl get pods -n kube-system +NAME READY STATUS RESTARTS AGE +... +magnum-nginx-ingress-controller-zxgj8 1/1 Running 0 65d +magnum-nginx-ingress-default-backend-9dfb4c685-8fjdv 1/1 Running 0 83d +... + +``` + +There is also an ingress class available in the default namespace: + +``` +kubectl get ingressclass +NAME CONTROLLER PARAMETERS AGE +nginx k8s.io/ingress-nginx 7m36s + +``` + +Step 2 Creating services for Nginx and Apache webserver[](#step-2-creating-services-for-nginx-and-apache-webserver "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------- + +You are now going to build and expose two minimal applications: + +> * Nginx server +> * Apache webserver + +They will be both exposed from a single public IP address using a single default ingress Load Balancer. The web pages served from each server will be accessible in the browser with a unified routing scheme. In a similar fashion, one could mix and match applications written in a variety of other technologies. + +First, let’s create the Nginx server app. For brevity, we use the command line with default settings: + +``` +kubectl create deployment nginx-web --image=nginx +kubectl expose deployment nginx-web --type=NodePort --port=80 + +``` + +Similarly, we create the Apache app: + +``` +kubectl create deployment apache-web --image=httpd +kubectl expose deployment apache-web --type=NodePort --port=80 + +``` + +The above actions result in creating a service for each app, which can be inspected using the below command. Behind each service, there is a deployment and a running pod. + +``` +kubectl get services + +``` + +You should see an output similar to the following: + +``` +kubectl get services +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +apache-web NodePort 10.254.80.182 80:32660/TCP 75s +kubernetes ClusterIP 10.254.0.1 443/TCP 84d +nginx-web NodePort 10.254.101.230 80:32532/TCP 36m + +``` + +The services were created with the type *NodePort*, which is a required type to work with ingress. Therefore, they are not yet exposed under a public IP. The servers are, however, already running and serving their default welcome pages. + +You could verify that by assigning a floating IP to one of the nodes (see [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html)). Then SSH to the node and run the following command: + +``` +curl : + +``` + +E.g. for the scenario above we see: + +``` +curl ingress-tqwzjwu2lw7p-node-1:32660 +

It works!

+ +``` + +Step 3 Create Ingress Resource[](#step-3-create-ingress-resource "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +To expose application to a public IP address, you will need to define an Ingress Resource. Since both applications will be available from the same IP address, the ingress resource will define the detailed rules of what gets served in which route. In this example, the */apache* route will be served from the Apache service, and all other routes will be served by the Nginx service. + +Note + +There are multiple ways the routes can be configured, we present here just a fraction of the capability. + +Create a YAML file called *my-ingress-resource.yaml* with the following contents: + +``` +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: +  name: example-ingress +  annotations: +    nginx.ingress.kubernetes.io/rewrite-target: / +spec: +  ingressClassName: nginx +  rules: +    - http: +        paths: +        - path: /* +          pathType: Prefix +          backend: +            service: +              name: nginx-web +              port: +                number: 80 +        - path: /apache +          pathType: Prefix +          backend: +            service: +              name: apache-web +              port: +                number: 80 + +``` + +And deploy with: + +``` +kubectl apply -f my-ingress-resource.yaml + +``` + +After some time (usually 2 to 5 minutes), verify that the floating IP has been assigned to the ingress: + +``` +kubectl get ingress +NAME CLASS HOSTS ADDRESS PORTS AGE +example-ingress nginx * 64.225.130.77 80 3m16s + +``` + +Note + +The address **64.225.130.77** is generated randomly and in your case it will be different. Be sure to copy and use the address shown by **kubectl get ingress**. + +Step 4 Verify that it works[](#step-4-verify-that-it-works "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Copy the ingress floating IP in the browser, followed by some example routes. You should see an output similar to the one below. Here is the screenshot for the */apache* route: + +![apache_route.png](../_images/apache_route.png) + +This screenshot shows what happens on any other route – it defaults to Nginx: + +![any_other_route.png](../_images/any_other_route.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You now have two of the most popular web servers installed as services within a Kubernetes cluster. Here are some ideas how to use this setup: + +**Create another service on the same server** + +To create another service under the same IP address, repeat the entire procedure with another endpoint name instead of */apache*. Don’t forget to add the apropriate entry into the YAML file. + +**Add other endpoints for use with Nginx** + +You can create other endpoints and use Nginx as the basic server instead of Apache. + +**Use images other than nginx and httpd** + +There are many sources of containers on the Internet but the most popular catalog is [dockerhub.com](https://hub.docker.com/search?q=). It contains operating systems images with preinstalled software you want to use, which will save you the effort of downloading and testing the installation. + +**Microservices** + +Instead of putting all of the code and data onto one virtual machine, the Kubernetes way is to deploy multiple custom containers. A typical setup would be like this: + +> * pod No. 1 would contain a database, say, MariaDB, as a backend, +> * pod No. 2 could contain PHPMyAdmin for a front end to the database, +> * pod No. 3 could contain installation of WordPress, which is the front end for the site visitor +> * pod No. 4 could contain your proprietary code for WordPress plugins. + +Each of these pods will take code from a specialized image. If you want to edit a part of the code, you just update the relevant Docker image on docker hub and redeploy. + +**Use DNS to create a domain name for the server** + +You can use a DNS service to connect a proper domain name to the IP address used in this article. With the addition of a Cert Manager and a free service such as Let’s Encrypt, an ingress will be running HTTPS protocol in a straightforward way. \ No newline at end of file diff --git a/docs/kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html.md b/docs/kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html.md new file mode 100644 index 0000000..9c70f5d --- /dev/null +++ b/docs/kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html.md @@ -0,0 +1,350 @@ +Volume-based vs Ephemeral-based Storage for Kubernetes Clusters on CloudFerro Cloud OpenStack Magnum[](#volume-based-vs-ephemeral-based-storage-for-kubernetes-clusters-on-brand-name-openstack-magnum "Permalink to this headline") +===================================================================================================================================================================================================================================== + +Containers in Kubernetes store files on-disk and if the container crashes, the data will be lost. A new container can replace the old one but the data will not survive. Another problem that appears is when containers running in a pod need to share files. + +That is why Kubernetes has another type of file storage, called *volumes*. They can be either *persistent* or *ephemeral*, as measured against the lifetime of a pod: + +> * Ephemeral volumes are deleted when the pod is deleted, while +> * Persistent volumes continue to exist even if the pod it is attached to does not exist any more. + +The concept of volumes was first popularized by Docker, where it was a directory on disk, or within a container. In CloudFerro Cloud OpenStack hosting, the default docker storage is configured to use ephemeral disk of the instance. This can be changed by specifying docker volume size during cluster creation, symbolically like this (see below for the full command to generate a new cluster using **–docker-volume-size**): + +``` +openstack coe cluster create --docker-volume-size 50 + +``` + +This means that a persistent volume of 50 GB will be created and attached to the pod. Using **–docker-volume-size** is a way to both reserve the space and declare that the storage will be persistent. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to create a cluster when **–docker-volume-size** is used +> * How to create a pod manifest with *emptyDir* as volume +> * How to create a pod with that manifest +> * How to execute *bash* commands in the container +> * How to save a file into persistent storage +> * How to demonstrate that the attached volume is persistent + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +2 **Creating clusters with CLI** + +The article [How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) will introduce you to creation of clusters using a command line interface. + +3 **Connect openstack client to the cloud** + +Prepare **openstack** and **magnum** clients by executing *Step 2 Connect OpenStack and Magnum Clients to Horizon Cloud* from article [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html) + +4 **Check available quotas** + +Before creating additional cluster check the state of the resources with Horizon commands **Computer** => **Overview**. + +5 **Private and public keys** + +An SSH key-pair created in OpenStack dashboard. To create it, follow this article [How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html). You will have created keypair called “sshkey” and you will be able to use it for this tutorial as well. + +6 **Types of Volumes** + +Types of volumes are described in the [official Kubernetes documentation](https://kubernetes.io/docs/concepts/storage/volumes/). + +Step 1 - Create Cluster Using **–docker-volume-size**[](#step-1-create-cluster-using-docker-volume-size "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +You are going to create a new cluster called *dockerspace* that will use parameter **–docker-volume-size** using the following command: + +``` +openstack coe cluster create dockerspace + --cluster-template k8s-1.23.16-cilium-v1.0.3 + --keypair sshkey + --master-count 1 + --node-count 2 + --docker-volume-size 50 + --master-flavor eo1.large + --flavor eo2.large + +``` + +After a few minutes the new cluster **dockerspace** will be created. + +Click on **Container Infra** => **Clusters** to show the three clusters in the system: *authenabled*, *k8s-cluster* and *dockerspace*. + +![dockerspace_created.png](../_images/dockerspace_created.png) + +Here are their instances (after clicking on **Compute** => **Instances**): + +![instances.png](../_images/instances.png) + +They will have at least two instances each, one for the master and one for the worker node. *dockerspace* has three instances as it has two worker nodes, created with flavor *eo2.large*. + +So far so good, nothing out of the ordinary. Click on **Volumes** => **Volumes** to show the list of volumes: + +![volumes.png](../_images/volumes.png) + +If **–docker-volume-size** is not turned on, only instances with *etcd-volume* in their names would appear here, as is the case for clusters *authenabled* and *k8s-cluster*. If it is turned on, additional volumes would appear, one for each node. *dockerspace* will, therefore, have one instance for master and two instances for worker nodes. + +Note the column **Attached**. All nodes for *dockerspace* use **/dev/vdb** for storage, which is a fact that will be important later on. + +As specified during creation, *docker-volumes* have size of 50 GB each. + +In this step, you have created a new cluster with docker storage turned on and then you verified that the main difference lies in creation of volumes for the cluster. + +Step 2 - Create Pod Manifest[](#step-2-create-pod-manifest "Permalink to this headline") +----------------------------------------------------------------------------------------- + +To create a pod, you need to use a file in *yaml* format that defines the parameters of the pod. Use command + +``` +nano redis.yaml + +``` + +to create file called *redis.yaml* and copy the following rows into it: + +``` +apiVersion: v1 +kind: Pod +metadata: + name: redis +spec: + containers: + - name: redis + image: redis + volumeMounts: + - name: redis-storage + mountPath: /data/redis + volumes: + - name: redis-storage + emptyDir: {} + +``` + +This is how it will look like in the terminal: + +![nano_redis_yaml.png](../_images/nano_redis_yaml.png) + +You are creating a *Pod*, its name will be *redis*, and it will occupy one container also called *redis*. The content of that container will be an image called **redis**. + +Redis is a well known database and its image is prepared in advance so can be pulled off directly from a repository. If you were implementing your own application, the best way would be to release it through Docker and pull from its repository. + +New volume is called *redis-storage* and its directory will be */data/redis*. The name of the volume will again be *redis-storage* and it will be of type *emptyDir*. + +An *emptyDir* volume is initially empty and is first created when a Pod is assigned to a node. It will exist as long as that Pod is running there and if the Pod is removed, the related data in *emptyDir* will be deleted permanently. However, the data in an *emptyDir* volume is safe across container crashes. + +Besides *emptyDir*, about a dozen other volume types could have been used here: *awsElasticBlockStore*, *azureDisk*, *cinder* and so on. + +In this step, you have prepared pod manifest with which you will create the pod in the next step. + +Step 3 - Create a Pod on Node **0** of *dockerspace*[](#step-3-create-a-pod-on-node-0-of-dockerspace "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +In this step you will create a new pod on node **0** of *dockerspace* cluster. + +First see what pods are available in the cluster: + +``` +kubectl get pods + +``` + +This may produce error line such as this one: + +``` +The connection to the server localhost:8080 was refused - did you specify the right host or port? + +``` + +That will happen in case you did not set up the kubectl parameters as specified in Prerequisites No. 3. You will now set it up for access to *dockerstate*: + +``` +mkdir dockerspacedir + +openstack coe cluster config +--dir dockerspacedir +--force +--output-certs +dockerspace + +``` + +First create a new directory, *dockerspacedir*, where the config file for access to the cluster will reside, then execute the **cluster config** command. The output will be a line like this: + +``` +export KUBECONFIG=/Users/duskosavic/CloudferroDocs/dockerspacedir/config + +``` + +Copy it and enter again as the command in terminal. That will give **kubectl** app access to the cluster. Create the pod with this command: + +``` +kubectl apply -f redis.yaml + +``` + +It will read parameters in *redis.yaml* file and send them to the cluster. + +Here is the command to access all pods, if any: + +``` +kubectl get pods + +NAME READY STATUS RESTARTS AGE +redis 0/1 ContainerCreating 0 7s + +``` + +Repeat the command after a few seconds and see the difference: + +``` +kubectl get pods + +NAME READY STATUS RESTARTS AGE +redis 1/1 Running 0 81s + +``` + +In this step, you have created a new pod on cluster *dockerspace* and it is running. + +In the next step, you will enter the container and start issuing commands just like you would in any other Linux environment. + +Step 4 - Executing *bash* Commands in the Container[](#step-4-executing-bash-commands-in-the-container "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------- + +In this step, you will start **bash** shell in the container, which in Linux is equivalent to start running the operating system: + +``` +kubectl exec -it redis -- /bin/bash + +``` + +The following listing is a reply: + +``` +root@redis:/data# df -h +Filesystem Size Used Avail Use% Mounted on +overlay 50G 1.4G 49G 3% / +tmpfs 64M 0 64M 0% /dev +tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup +/dev/vdb 50G 1.4G 49G 3% /data +/dev/vda4 32G 4.6G 27G 15% /etc/hosts +shm 64M 0 64M 0% /dev/shm +tmpfs 3.9G 16K 3.9G 1% /run/secrets/kubernetes.io/serviceaccount +tmpfs 3.9G 0 3.9G 0% /proc/acpi +tmpfs 3.9G 0 3.9G 0% /proc/scsi +tmpfs 3.9G 0 3.9G 0% /sys/firmware + +``` + +This is what it would look like in the terminal: + +![redis-data.png](../_images/redis-data.png) + +Note that the prompt changed to + +``` +root@redis:/data# + +``` + +which means you are now issuing commands within the container itself. The pod operates as Fedora 33 and you can use **df** to see the volumes and their sizes. Command + +``` +df -h + +``` + +lists sizes of files and directories in a human fashion (the usual meaning of parameter **-h** would be *Help*, while here it is short for *Human*). + +In this step, you have activated the container operating system. + +Step 5 - Saving a File Into Persistent Storage[](#step-5-saving-a-file-into-persistent-storage "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +In this step you are going to test the longevity of files on persistent storage. You will first + +> * save a file into the */data/redis* directory, then +> * kill the Redis process, which in turn will +> * kill the container; finally, you will +> * re-enter the pod, + +where you will find the file intact. + +Note that **dev/vdb** has 50 GB in size in the above listing and connect it to the column **Attached To** in the **Volumes** => **Volumes** listing: + +![devvdb.png](../_images/devvdb.png) + +In its own turn, it is tied to an instance: + +![instance.png](../_images/instance.png) + +That instance is injected into the container and – being an independent instance – acts as persistent storage to the pod. + +Create a file on the *redis* container: + +``` +cd /data/redis/ +echo Hello > test-file + +``` + +Install software to see the **PID** number of *Redis* process in the container + +``` +apt-get update +apt-get install procps +ps aux + +``` + +These are the running processes: + +![redis_kill.png](../_images/redis_kill.png) + +Take the **PID** number for *Redis* process (here it is **1**), and eliminate it with command + +``` +kill 1 + +``` + +That will first kill the container and then exit its command line. + +In this step, you have created a file and killed the container that contains the file. This sets up the ground for testing whether the files survive container crash. + +Step 6 - Check the File Saved in Previous Step[](#step-6-check-the-file-saved-in-previous-step "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +In this step, you will find out whether the file *test-file* is still existing. + +Enter the pod again, activate its **bash** shell and see whether the file has survived: + +``` +kubectl exec -it redis -- /bin/bash +cd redis +ls + +test-file + +``` + +Yes, the file *test-file* is still there. The persistent storage for the pod contains it in path */data/redis*: + +![final_result.png](../_images/final_result.png) + +In this step, you have entered the pod again and found out that the file has survived intact. That was expected, as volumes of type *emptyDir* will survive container crashes as long as the pod is existing. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +*emptyDir* survives container crashes but will disappear when the pod disappears. Other volume types may survive loss of pods better. For instance: + +> * *awsElasticBlockStore* will have the volume unmounted when the pod is gone; being unmounted and not destroyed, it will persist the data it is containing. This type of volume can have pre-populated data and can share the data among the pods. +> * *cephfs* can also have pre-populated data and share them among the pods, but can additionally also be mounted by multiple writers at the same time. + +Other constraints may also apply. Some of those volume types will require their own servers to be activated first, or that all nodes on which Pods are running need be of the same type and so on. Prerequisite No. 6 will list all types of volumes for Kubernetes clusters so study it and apply to your own Kubernetes apps. \ No newline at end of file diff --git a/docs/kubernetes/kubernetes.html.md b/docs/kubernetes/kubernetes.html.md new file mode 100644 index 0000000..a17983f --- /dev/null +++ b/docs/kubernetes/kubernetes.html.md @@ -0,0 +1,2 @@ +KUBERNETES[](#kubernetes "Permalink to this headline") +======================================================= \ No newline at end of file diff --git a/docs/networking/Cannot-access-VM-with-SSH-or-PING-on-CloudFerro-Cloud.html.md b/docs/networking/Cannot-access-VM-with-SSH-or-PING-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..bc907d7 --- /dev/null +++ b/docs/networking/Cannot-access-VM-with-SSH-or-PING-on-CloudFerro-Cloud.html.md @@ -0,0 +1,4 @@ +Cannot access VM with SSH or PING on CloudFerro Cloud[](#cannot-access-vm-with-ssh-or-ping-on-brand-name "Permalink to this headline") +======================================================================================================================================= + +Before contacting the Support, please make sure that the port 22 (SSH) is allowed in the Security Groups associated with your instance. If this is configured correctly, please try to perform a soft or hard reboot of your VM. Lack of connection could have been caused by the expired DHCP. Rebooting will allow you to get a fresh DHCP session and everything should work fine. \ No newline at end of file diff --git a/docs/networking/Cannot-ping-VM-on-CloudFerro-Cloud.html.md b/docs/networking/Cannot-ping-VM-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..108419c --- /dev/null +++ b/docs/networking/Cannot-ping-VM-on-CloudFerro-Cloud.html.md @@ -0,0 +1,47 @@ +Cannot ping VM on CloudFerro Cloud[](#cannot-ping-vm-on-brand-name "Permalink to this headline") +================================================================================================= + +If you have problems with access to your VM - ping is not responding. Try the following: + +install the packages **net-tools** (to have the **ifconfig** command) and **arping**: + +in CentOS: + +``` +sudo yum install net-tools arping + +``` + +in Ubuntu: + +``` +sudo apt install net-tools arping + +``` + +check the name of the interface connected to private network: + +``` +ifconfig + +``` + +based on the response, find the number of the interface of 192.168.x.x (eth or ens) + +after that invoke the following commands: + +in CentOS: + +``` +sudo arping -U -c 2 -I eth $(ip -4 a show dev eth | sed -n 's/.*inet \([0-9\.]\+\).*/\1/p') + +``` + +in Ubuntu: + +``` +sudo arping -U -c 2 -I ens $(ip -4 a show dev ens | sed -n 's/.*inet \([0-9\.]\+\).*/\1/p') + +``` + +Next ping your external ip address and check if it helped. \ No newline at end of file diff --git a/docs/networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html.md b/docs/networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e2ecf08 --- /dev/null +++ b/docs/networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,67 @@ +Generating an SSH keypair in Linux on CloudFerro Cloud[](#generating-an-ssh-keypair-in-linux-on-brand-name "Permalink to this headline") +========================================================================================================================================= + +In order to generate an SSH keypair in Linux, we recommend using the command **ssh-keygen**. + +If system does not see this packet installed, install the latest updates: + +Ubuntu and Debian family +: ``` + sudo apt-get update && apt-get install openssh-client + + ``` + +CentOS and Red Hat +: ``` + sudo yum install openssh-clients + + ``` + +After that, use the following command in terminal: + +``` +ssh-keygen + +``` + +with additional flags: + +`-t` +: rsa authentication key type + +`-b` +: 4096 bit length, 2048 if not specified. Available values: 1024, 2048, 4096. + The greater the value, the more complicated the key will be. + +`-C` +: *user@server* name for identification at the end of the file + +`-f` +: ~/.ssh/keys/keylocation location of folder with ssh keys + +`-N` +: passphrase, can be omitted if user prefers connecting without additional key security + +![ssh1.png](../_images/ssh1.png) + +Application will ask for the name of the key. Press **Enter** for defaults: + +> * **id\_rsa** for private and +> * **id\_rsa.pub** for public key and passphrase (pressing **Enter** ignores it). + +![ssh2.png](../_images/ssh2.png) + +Next, **ssh-keygen** will show + +> * location, where the keys are saved, +> * fingerprint of keypair and certain +> * semi-graphic image as expression of randomness in generating unique key. + +![ssh3.png](../_images/ssh3.png) + +To avoid problem with rejecting files due to too open permissions, navigate to the folder containing both keys and enter command: + +``` +chmod 600 id_rsa && chmod 600 id_rsa.pub + +``` \ No newline at end of file diff --git a/docs/networking/How-can-I-access-my-VMs-using-names-instead-of-IP-addresses-on-CloudFerro-Cloud.html.md b/docs/networking/How-can-I-access-my-VMs-using-names-instead-of-IP-addresses-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..9b47931 --- /dev/null +++ b/docs/networking/How-can-I-access-my-VMs-using-names-instead-of-IP-addresses-on-CloudFerro-Cloud.html.md @@ -0,0 +1,15 @@ +How can I access my VMs using names instead of IP addresses on CloudFerro Cloud[](#how-can-i-access-my-vms-using-names-instead-of-ip-addresses-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================================== + +The VMs are seen simultaneously in several networks, at least in your “private” LAN and in the public Internet. By default the public addresses (Floating IPs, 185.48.x.x) have no associated names. You may assign such names from your DNS domain or you may request a name from us (as an additional service). The names provided by us have the following format: + +``` +computer_name.users.creodias.eu + +``` + +where **computer\_name** is chosen by you. + +If you need the name just to access the machine from your office workstation, the simplest way is to add its address and friendly name to **/etc/hosts**. + +The VMs in a given project share a common “private” network – by default it is **10.0.0.0/24**. You may create additional private networks with any addresses you like. However, they will not be equipped with DNS. If the machines are expected to recognize each other by their names, either **/etc/hosts** needs to be created and copied to all machines, or a private DNS may be run on one of them. Moreover, although the addresses are dynamically assigned, they are constant which means they do not change from the moment of creation to the moment of deletion of your machine. \ No newline at end of file diff --git a/docs/networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html.md b/docs/networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..02066b0 --- /dev/null +++ b/docs/networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html.md @@ -0,0 +1,19 @@ +How can I open new ports for http for my service or instance on CloudFerro Cloud[](#how-can-i-open-new-ports-for-http-for-my-service-or-instance-on-brand-name "Permalink to this headline") +============================================================================================================================================================================================= + +To open a new port for a service on an instance, click Project -> Network -> Security Groups and click “Create Security Group”. + +By default, in the newly created group there will two Egress (outgoing) rules - for IPv4 and IPv6. + +You need to create a new Ingress (incoming) rule that should look like this: + +``` +Ingress IPv4 TCP 80 (HTTP) 0.0.0.0/0 + +``` + +After creating a new Security Group you have to add it to your instance. + +To do so, simply click Project -> Compute -> Instances, then select “Edit Security Groups” and add it by clicking the “+” button. + +![edit.png](../_images/edit.png) \ No newline at end of file diff --git a/docs/networking/How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html.md b/docs/networking/How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..1c58602 --- /dev/null +++ b/docs/networking/How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html.md @@ -0,0 +1,31 @@ +How is my VM visible in the internet with no Floating IP attached on CloudFerro Cloud[](#how-is-my-vm-visible-in-the-internet-with-no-floating-ip-attached-on-brand-name "Permalink to this headline") +======================================================================================================================================================================================================= + +This article is written for clarification how an instance without a floating IP address would respond if we were to search for it it from an external machine. + +How to find out what IP address is attached to VM?[](#how-to-find-out-what-ip-address-is-attached-to-vm "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +In Linux you can easily see your IP by executing command: + +``` +curl ifconfig.me + +``` + +In Windows, the easiest way is visiting website that shows us our public and private IP address, for example: [whatismyipaddress.com/](https://whatismyipaddress.com//) + +Is my VM visible from Internet without floating IP assigned?[](#is-my-vm-visible-from-internet-without-floating-ip-assigned "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------------- + +No. If we don’t associate a Floating IP to the VM, it won’t be routable from the internet. By setting an IP address using the process mentioned above, we will only see the interface address of the router attached to the private network (by default 192.168.0.1) + +Can I send data from my VM without a floating IP?[](#can-i-send-data-from-my-vm-without-a-floating-ip "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------ + +Yes. If you want to send data from your VM to an external server, you should also allow receiving packets from 192.168.0.1 in your firewall configuration. + +Is my VM accessible from the outside without floating IP?[](#is-my-vm-accessible-from-the-outside-without-floating-ip "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------- + +No. If a VM needs to be accessible from the Internet, a floating IP address must be attached to the instance. For more information on assigning Floating IPs to the instance, please see the following article: [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html). \ No newline at end of file diff --git a/docs/networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..a0ffaea --- /dev/null +++ b/docs/networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html.md @@ -0,0 +1,70 @@ +How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud[](#how-to-add-or-remove-floating-ips-to-your-vm-on-brand-name "Permalink to this headline") +============================================================================================================================================================== + +In order to make your VM accessible from the Internet, you need to use Floating IPs. Floating IPs in OpenStack are public IP addresses assigned to your Virtual Machines. Assignment of a Floating IP allows you (if you have your Security Groups set properly) to host services like SSH or HTTP over the Internet. + +How to assign a Floating IP to your VM?[](#how-to-assign-a-floating-ip-to-your-vm "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------- + +In the Instances tab in Horizon, click the dropdown menu next to your VM and choose **Associate Floating IP**. + +![fip1.png](../_images/fip1.png) + +You will be shown a window like this: + +![fip2.png](../_images/fip2.png) + +You may choose an address from the dropdown menu, but if it’s empty, you need to allocate an address first. Click the **+** icon on the right. + +![fip3.png](../_images/fip3.png) + +Click **Allocate IP**. + +Warning + +Please always choose the *external* network! + +![fip4.png](../_images/fip4.png) + +Select your newly allocated IP address and click **Associate**. + +![fip5.png](../_images/fip5.png) + +Note + +The IP address should be associated with a local address from the **192.168.x.x** subnet. If you have a **10.x.x.x** address change it to an **192.168.x.x** address. + +Click **Associate**. + +Note + +The VM’s communicate between themselves trough an internal network **192.168.x.x** so if you are connecting from one Virtual Machine to another +you should use private addresses. If you try to connect your VM to the wrong network you will be notified by the following message: + +![fip6.png](../_images/fip6.png) + +You now have a public IP assigned to your instance. It is visible in the Instances menu: + +![fip7.png](../_images/fip7.png) + +You can now connect to your Virtual Machine trough SSH or RDP from the Internet. + +How to disassociate a Floating IP?[](#how-to-disassociate-a-floating-ip "Permalink to this headline") +------------------------------------------------------------------------------------------------------ + +If you no longer need a public IP address you may disassociate it from your VM. Click **Dissasociate Floating IP** from the dropdown menu: + +![fip8.png](../_images/fip8.png) + +How to release a Floating IP (return it to the pool)?[](#how-to-release-a-floating-ip-return-it-to-the-pool "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------ + +Floating IPs (just like any other OpenStack resource) have their cost when kept reserved and not used. + +If you don’t want to keep your Floating IP’s reserved for your project you may release them to the OpenStack pool for other users which will also reduce the costs of your project. + +Go to Project → Network → Floating IPs + +![fip9.png](../_images/fip9.png) + +For the address that is not in use, the **Release Floating IP** option will be available. Click it to release the IP address. \ No newline at end of file diff --git a/docs/networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..1aef400 --- /dev/null +++ b/docs/networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html.md @@ -0,0 +1,31 @@ +How to import SSH public key to OpenStack Horizon on CloudFerro Cloud[](#how-to-import-ssh-public-key-to-openstack-horizon-on-brand-name "Permalink to this headline") +======================================================================================================================================================================= + +If you already have an SSH key pair on your computer, you can import your public key to the Horizon dashboard. Then, you will be able to use that imported key when launching a new instance. + +By importing it directly to Horizon, you will eliminate the need to use tools like **ssh-copy-id** or manually edit the **authorized\_keys** file. Also, your key will be available in OpenStack CLI. + +Warning + +After uploading your public key, you will not be able to apply it to an already created virtual machine. If you need to add a key to an existing VM, please follow this article instead: [How to add SSH key from Horizon web console on CloudFerro Cloud](How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html). + +Note + +You can have multiple SSH keys uploaded to your Horizon dashboard. You can then use them for different tasks. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Preparation +> * Importing a Key + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Generated SSH key pair** + +You need a generated SSH key pair on your computer. If you do not have one yet, you can create it by following one of these articles: \ No newline at end of file diff --git a/docs/networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..bab1ac1 --- /dev/null +++ b/docs/networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html.md @@ -0,0 +1,41 @@ +How to add SSH key from Horizon web console on CloudFerro Cloud[](#how-to-add-ssh-key-from-horizon-web-console-on-brand-name "Permalink to this headline") +=========================================================================================================================================================== + +While using web console on your VM, you may face situation when you will have to enter SSH public key. + +Unfortunately, copy/paste functionality in not supported by our console. For adding a key to an existing instance, the easiest method would be getting the key via curl. + +For instance you may go to and put your public key there (you can set if and how long content is visible to others and so on) + +![pastebin1.png](../_images/pastebin1.png) + +copy URL of raw pastebin content (for obtaining a raw content, click on “Raw” icon), + +![pastebin2.png](../_images/pastebin2.png) + +![pastebin3.png](../_images/pastebin3.png) + +and issue the command from inside of instance: + +``` +curl > mykey.txt + +``` + +![pastebin4.png](../_images/pastebin4.png) + +After downloading the file, you may check if your key is saved correctly using cat command: + +``` +cat mykey.txt + +``` + +![pastebin5.png](../_images/pastebin5.png) + +Please note that the key must be put into /home/eouser/.ssh/authorized\_keys, because you can ssh to your instance as eouser, but not as eoconsole. So once you are eoconsole user and get the key as described above, you should use: + +``` +cat mykey.txt | sudo tee -a /home/eouser/.ssh/authorized_keys + +``` \ No newline at end of file diff --git a/docs/networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..34a66e3 --- /dev/null +++ b/docs/networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,38 @@ +How to connect to your virtual machine via SSH in Linux on CloudFerro Cloud[](#how-to-connect-to-your-virtual-machine-via-ssh-in-linux-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================== + +**1. Prerequisites:** + +1.1. Private and public keys have been created. The key files were saved on the local disk of the VM you wish to connect to. It is recommended to put the keys in the **~/.ssh** folder. + +1.2. During the VM setup, the generated key we want to use was assigned. + +For example, when you create an SSH key named “**testkey**” in the Horizon dashboard, its name will appear next to your VM. + +![ssh_linux1.png](../_images/ssh_linux1.png) + +**2. Connecting to a virtual machine via SSH:** + +2.1. If your virtual machine has already been assigned a Floating IP (the instances menu next to your virtual machine lists the IP address) you can proceed to the next step. If not, please follow the guide: [How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html). + +2.2. Go to the **~/.ssh** folder where your SSH keys were saved to. Start your terminal (right click and click “Open in Terminal”). + +2.3. Change the permissions of the private key file. In the case of the file named **id\_rsa**, type: + +``` +sudo chmod 600 id_rsa + +``` + +Enter your password and confirm. + +2.4. Once you have completed all of the steps above, you can log in. Let us assume that your generated and assigned Floating IP address in this case is **64.225.132.99**. Execute the following command in the terminal: + +``` +ssh [email protected] + +``` + +2.5. The username in the terminal will change to **eouser**. This means that the SSH connection was successful. + +![ssh_linux2.png](../_images/ssh_linux2.png) \ No newline at end of file diff --git a/docs/networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..a2f36d5 --- /dev/null +++ b/docs/networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html.md @@ -0,0 +1,60 @@ +How to create a network with router in Horizon Dashboard on CloudFerro Cloud[](#how-to-create-a-network-with-router-in-horizon-dashboard-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================== + +When you create a new project in Horizon, its content is empty. You have to manually configure your private network. In order to complete this task, please follow those steps. + +1. Log in to your OpenStack dashboard and choose **Network** tab, then choose **Networks** sub-label. + +![net1.png](../_images/net1.png) + +2. Click on the **“Create Network”** button. + +![net2.png](../_images/net2.png) + +3. Define your Network Name and tick two checkboxes: **Enable Admin State** and **Create Subnet**. Go to Next. + +![net3.png](../_images/net3.png) + +4. Define your Subnet name. Assign a valid network address with mask presented as a prefix. (This number determines how many bytes are being destined for network address) + +Define Gateway IP for your Router. Normally it’s the first available address in the subnet. + +Go to Next. + +![net4.png](../_images/net4.png) + +5. In Subnet Details you are able to turn on DHCP server, assign DNS servers to your network and set up basic routing. In the end, confirm the process with **“Create”** button. + +![net5.png](../_images/net5.png) + +6. Click on the **Routers** tab. + +![net6.png](../_images/net6.png) + +7. Click on the **“Create Router”** button. + +![net7.png](../_images/net7.png) + +8. Name your device and assign the only available network → external. Finish by choosing **“Create Router”** blue button. + +![net8.png](../_images/net8.png) + +9. Click on your newly created Router (e.g called “Router\_1”). + +![net9.png](../_images/net9.png) + +10. Choose **Interfaces**. + +![net10.png](../_images/net10.png) + +11. Choose **+ Add Interface** button. + +![net11.png](../_images/net11.png) + +12. Assign a proper subnet and fill in IP Address. (It’s the gateway for our network). Submit the process. + +![net12.png](../_images/net12.png) + +13. The internal interface has been attached to the router. + +![net13.png](../_images/net13.png) \ No newline at end of file diff --git a/docs/networking/How-to-run-and-configure-Firewall-as-a-service-and-VPN-as-a-service-on-CloudFerro-Cloud.html.md b/docs/networking/How-to-run-and-configure-Firewall-as-a-service-and-VPN-as-a-service-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..41c822e --- /dev/null +++ b/docs/networking/How-to-run-and-configure-Firewall-as-a-service-and-VPN-as-a-service-on-CloudFerro-Cloud.html.md @@ -0,0 +1,266 @@ +How to run and configure Firewall as a service and VPN as a service on CloudFerro Cloud[](#how-to-run-and-configure-firewall-as-a-service-and-vpn-as-a-service-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================================================== + +Note + +This guide provides a sample process for configuring VPN as a service. It should not be considered the only way to configure this solution. + +To start the VPN as a service, it is necessary to configure and start the Firewall as a service. +The sequence of steps will be described below. + +**Creating FWAAS infrastruture** + +**Creating and configuring local networks** + +1. Log in to your OpenStack dashboard and choose **Network** tab, then choose **Networks** sub-label. + +![screen1.png](../_images/screen1.png) + +2. Click on the **“Create Network”** button. + +![screen2.png](../_images/screen2.png) + +3. Define your Network Name as “Gateway” and go to Subnet Tab. +4. Define your Subnet name as “Gateway\_subnet”. Network address: **10.100.100.0/24** and gateway IP **10.100.100.1**. + +![screen3.png](../_images/screen3.png) + +5. In Subnet Details keep **Enable DHCP** marked. Rest of fields leave blank and click **Create** button. + +![screen4.png](../_images/screen4.png) + +6. Repeat this procedure from points 2-5 using different data: + +* Network Name: **“Internal”** +* Subnet Name: **“Internal\_subnet”** +* Network Address: **10.200.200.0/24** +* Gateway IP: **10.200.200.1** + +7. Click on the **Create Router** button. + +![screen5.png](../_images/screen5.png) + +8. Name your device as for example **“Router\_Fwaas”**. Choose **external** network in **External Network** tab. Click **Create Router**. + +![screen6.png](../_images/screen6.png) + +9. Click on your newly created Router (e.g called “Router\_Fwaas”). + +![screen7.png](../_images/screen7.png) + +10. Choose **Interfaces** and **Add Interface** button. + +![screen8.png](../_images/screen8.png) + +11. Choose from **Subnet** menu the **Gateway** subnet and click **Submit** button. + +![screen9.png](../_images/screen9.png) + +12. Choosing **Network -> Network Topology** the network topology should looks like this. + +![scrn10.png](../_images/scrn10.png) + +**Creating and configuring the VM with installed Firewall client** + +13. Open **Compute -> Instances** tab and choose **Launch instance**. + +![screen11.png](../_images/screen11.png) + +14. Name the VM instance (for example **Firewall\_VM**) and go to **Source** tab. + +![screen12.png](../_images/screen12.png) + +15. Find **opnsense** image and add it to your VM. Go to **Flavor** tab. + +![screen13.png](../_images/screen13.png) + +16. Choose the specification of your VM. Prequisities to launch Firewall: + +* Minimal: CPU 1 Core, 2 GB RAM memory, 8GB SSD drive (eo1.xmedium flavor) +* Optimal: CPU 2 Core, 4 GB RAM memory, 16GB SSD drive (eo1.medium flavor) + +Go to **Networks** tab. + +![screen14.png](../_images/screen14.png) + +17. Add created local networks in correct order: + +1. Internal network +2. Gateway network + +![screen15.png](../_images/screen15.png) + +18. Delete all security groups and open Configuration tab. + +![screen16.png](../_images/screen16.png) + +19. Paste configuration script presented below: + +``` +#cloud-config + +runcmd: +- | + address=$(curl http://169.254.169.254/latest/meta-data/local-ipv4) + first=$(echo "$address" | /usr/bin/cut -d'.' -f1) + second=$(echo "$address" | /usr/bin/cut -d'.' -f2) + third=$(echo "$address" | /usr/bin/cut -d'.' -f3) + sed -i '' "s/192.168.*.*<\/ipaddr>/$first.$second.$third.1<\/ipaddr>/" /conf/config.xml + sed -i '' '/enabled<\/disablefilter>/g' /conf/config.xml + reboot + +``` + +![screen17b.png](../_images/screen17b.png) + +Choose **launch instance**. + +20. After creating VM click its name in instances tab. + +![screen18.png](../_images/screen18.png) + +21. Choose **interfaces** tab and click **edit port** next to each port. + +![screen19.png](../_images/screen19.png) + +22. Disable **port security** and click **update**. + +![screen20.png](../_images/screen20.png) + +23. Go to **Network -> Floating IPs** menu and choose **Allocate IP to project**. + +![screen21.png](../_images/screen21.png) + +24. Choose **Allocate IP**. + +![screen22.png](../_images/screen22.png) + +25. Click **Associate** next to newly generated **Floating IP** and assign it to your **Firewall\_VM** port. + +![screen23.png](../_images/screen23.png) + +26. After creation the Firewall VM LAN address **vtnet0** should be 10.200.200.1 (you can check it using console on Horizon). + +![screen23a.png](../_images/screen23a.png) + +**Configuring VPN service** + +Prerequisities: For configuring your VPN server using Graphical Interface you need a VM with preinstalled GUI (for example MINT, XFCE etc.) and connected to **Internal** network. Click here for instructions how to install GUI on Ubuntu 20.04 VM: [How to Use GUI in Linux VM on CloudFerro Cloud and access it From Local Linux Computer](../cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html). + +27. In your default WEB browser open IP **10.200.200.1**. + +* User: **root** +* Password: **opnsense** + +![screen24a.png](../_images/screen24a.png) + +28. **Click VPN -> OpenVPN -> Servers** on the left. At the bottom of new page click the wand icon of **Use a wizard to setup a new server**. + +![screen25a.png](../_images/screen25a.png) + +29. On the Authentication Type Selection page, ensure Type of Server is set to **Local User Access** and click Next. + +![screen26a.png](../_images/screen26a.png) + +30. Set the fields in the following order: + +* Decriptive name: **Name of your VPN Server Certificate** (eg. OPNsense-CA) +* Key lenght: **2048 bit** +* Lifetime: **Lifetime in days of your VPN Server certificate** (eg. 825) +* Country Code: **Two-letter ISO country code** +* State or Province: **Full State of Province name, not abbreviated** +* City: **City or other locality name** +* Organization: **Organization name, often the Company or Group name** +* Email: **E-mail address for the Certificate contact** + +![screen27a.png](../_images/screen27a.png) + +31. Click **Add new CA** to continue and **Add new Certificate** on the next page. + +![screen28a.png](../_images/screen28a.png) + +32. On the **Add a Server Certificate page**, set the **Descriptive name** to server, leave the Key length at **2048 bit** and set the Lifetime to **3650**. + +![screen29b.png](../_images/screen29b.png) + +33. Click **Create new Certificate** to continue. +34. The next page should be Server Setup, set the following: + +* Set Interface to **WAN** +* Ensure Protocol is UDP and Port is **1194** +* Set a description, for example **“VPN Server”** +* Change DH Parameters Length to **4096** +* Change Encryption Algorithm to **‘AES-256-CBC (256 bit key, 128 bit block)’** +* Change Auth Digest Algorithm to **‘SHA512 (512-bit)’** +* In the IPv4 Tunnel Network field, enter **‘10.0.8.0/24’** +* To allow access to machines on the local network, enter your local IP range in the Local Network setting. It should be **10.200.200.0/24** +* Set the Compression to **‘No Preference’** +* Set DNS Server 1 to **10.0.8.1** + +All other options can be left. Click Next. + +![screen30b.png](../_images/screen30b.png) + +35. On the Firewall Rule Configuration, tick both the **Firewall Rule** and **OpenVPN** rule checkboxes and click Next. + +![screen31a.png](../_images/screen31a.png) + +36. Now your VPN server is succesfully created. + +![screen32a.png](../_images/screen32a.png) + +**User Setup** + +**Creating new User** + +37. Click **System -> Access -> Users** on the left and choose **Add** icon on the left of Users page. + +![screen33a.png](../_images/screen33a.png) + +38. Enter a **Username**, **Password**, and tick the box Click to create a user certificate further down. Fill any other fields you would like, but they are not required. Choose **click to create a user certificate**. + +![screen34a.png](../_images/screen34a.png) + +39. You will be taken to a Certificates page. Select **‘Create an internal Certificate’** in the Method drop down box. The page will re-arrange itself. +40. Ensure **Certificate Authority** is the name we created during the wizard which should be **‘OPNsense-CA’**, and Type is **‘Client Certificate’**. + +![screen35a.png](../_images/screen35a.png) + +41. Change Lifetime (days) of the certificate and click **Save**. + +![screen36.png](../_images/screen36.png) + +42. You will be taken back to the **Create User** page, **User Certificates** should now have an entry, click Save down the bottom again. + +**Setting UP Open VPN Client** +For connect to your VPN server you need a VPN client. You can use one of the reccomended software like OpenVPN or Viscocity. Below you can find the insctructions how to use Open VPN client for connecting to VPN Server. + +**Export Connection from OPNsense** + +43. Click **VPN -> OpenVPN -> Client Export** on the left. Change hostname to Floating IP assigned to your VPN Server. + +![scrn30.png](../_images/scrn30.png) + +44. Click the cloud icon next to your username or server name to download certificate and configuration files. + +![scrn28.png](../_images/scrn28.png) + +45. Unpack downloaded configuration files and find Open VPN config file. + +**For Windows PC’s:** + +46. Download and install the newest version of Open VPN. You can find it here: +47. Save all the connfiguration files in **C:/Program Files/OpenVPN/config** and try to connect using pre-configured credentials. + +**For Linux (Ubuntu) PC’s** + +48. Open the Terminal in folder which contains configuration files. +49. Use commands presented below: + +``` +sudo apt update +sudo nmcli connection import type openvpn file nameofyourovpnconffile.ovpn + +``` + +50. Try to connect to VPN using Ubuntu configuration bar (right up corner) and apropriate credentials. \ No newline at end of file diff --git a/docs/networking/networking.html.md b/docs/networking/networking.html.md new file mode 100644 index 0000000..324b230 --- /dev/null +++ b/docs/networking/networking.html.md @@ -0,0 +1,2 @@ +NETWORKING[](#networking "Permalink to this headline") +======================================================= \ No newline at end of file diff --git a/docs/openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html.md b/docs/openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html.md new file mode 100644 index 0000000..3b1816b --- /dev/null +++ b/docs/openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html.md @@ -0,0 +1,174 @@ +How to Create and Configure New Openstack Project Through Horizon on CloudFerro Cloud Cloud[](#how-to-create-and-configure-new-openstack-project-through-horizon-on-brand-name-cloud-name-cloud "Permalink to this headline") +============================================================================================================================================================================================================================== + +Default elements of the account[](#default-elements-of-the-account "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +When you first create your account at CloudFerro Cloud hosting, default values for the account will be applied. Among others, you will + +> * become owner of a *tenant manager* account and +> * have a default project created along with +> * three networks and +> * two security groups. + +In OpenStack terminology, the role of **tenant manager** is to be an administrator of the account. As a tenant manager, you can + +> * use the account directly but can also +> * create other users od the account. + +Before users can start using the account, you have to create project and attach other elements to it: users, groups, roles and so on. Then you invite a user to the organization and they log in with their own login details. There is a catch, though: + +> * new project that the tenant manager creates will **not** have automatically generated **external** network while +> * the **allow\_ping\_ssh\_icmp\_rdp** security group will not be generated either. + +In other words, the users of the account won’t have access to the Internet. + +In this article you will see how to overcome these problems. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Introduction to OpenStack Projects** + +The article [What is an OpenStack project on CloudFerro Cloud](../cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html) will define basic elements of an OpenStack project – groups, projects, roles and so on. + +No. 3 **Security groups** + +The article [How to use Security Groups in Horizon on CloudFerro Cloud](../cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html) describes how to create and edit security groups. They enable ports through which the virtual machine communicates with other networks, in particular, with the Internet at large. + +No. 4 **Create network with router** + +Here is how to create a network with router: + +[How to create a network with router in Horizon Dashboard on CloudFerro Cloud](../networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html) + +Default values in the tenant manager account[](#default-values-in-the-tenant-manager-account "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------- + +Click on **Network** -> **Networks** and verify the presence of the three default networks. Since the cloud contains number **341** in its name, the networks will have it too: **cloud\_00341\_3** and **eodata\_00341\_**. + +![present_networks.png](../_images/present_networks.png) + +Note + +This number, **341**, will vary from cloud to cloud and you can see it in the upper left corner of the browser window. + +In particular, two networks that come as default have their names starting with: + +> * **cloud\_00**, the network for internal communication of all the objects in the account +> * **eodata\_00**, the network for accessing the Earth Observation Data (images from satellites for you to use) +> * The third network is called **external** and has access to the outside world – the Internet, at large. + +Click on option **Network** -> **Security Groups** to verify the presence of two default security groups: + +![default_security_groups.png](../_images/default_security_groups.png) + +The default security groups are: + +> * **default**, the default security group +> * **allow\_ping\_ssh\_icmp\_rdp**, to allow access for the usual types of traffic: for the Internet, from Windows to the cloud and so on. + +The former shuts down any communication to the virtual machine for security reasons while the latter opens up only the ports for normal use. In this case, it will be for traffic of types **ping**, **ssh**, **icmp** and **rdp**. Please see Prerequisite No. 3 for definition of those terms. + +Create a New Project[](#create-a-new-project "Permalink to this headline") +--------------------------------------------------------------------------- + +A project can contain users, groups and their roles so the first step is to define a project and later add users, groups and roles. + +Step 1 Create Project[](#step-1-create-project "Permalink to this headline") +----------------------------------------------------------------------------- + +Choose **Identity** → **Projects** menu on the left side of the screen. + +![identity_projects.png](../_images/identity_projects.png) + +Click on **Create Project** button. + +Complete the project name (this is obligatory) and make sure that checkbox **Enable** is ticked on so that your project becomes active. + +![create_project.png](../_images/create_project.png) + +Next switch on the **Project Members** tab. + +![screen03.png](../_images/screen03.png) +![screen03a.png](../_images/screen03a.png) + +You can add users to project by clicking on “+” icon from the user list. + +It is possible to grant privileges to all of the members in project by selecting proper role from the drop-down menu. + +![select_role.png](../_images/select_role.png) + +Role **member** is the most basic role which has access to most parts of the cloud. Roles starting with *k8s-* are accessing Kubernetes clusters so disregard them if you are not using Kubernetes clusters in your project. For security reasons user types *heat\_stack\_user* and *admin* should **not** be used unless you know what you are doing. + +The last tab, **Project Groups**, allows you to add groups of users with the same privileges. + +To finish setting up a new project, click on the blue **Create Project** button. + +If you have set up the configuration properly, new project should appear in the list. Note the **Project ID** column as it will be needed in the next step. + +![new_project.png](../_images/new_project.png) + +You now have two projects at your disposal: + +![projects_present.png](../_images/projects_present.png) + +To activate the new project, **testproject**, click on its name. The name of the active project will be available in the upper left corner: + +![testproject.png](../_images/testproject.png) + +As mentioned earlier, your new project will **not** have access to the external network. To verify, choose project, select **Network** -> **Networks** and you will see that the new project has no networks defined. + +![no_networks_present.png](../_images/no_networks_present.png) + +For security groups, the situation is similar: the default one is present, but the **allow\_ping\_ssh\_icmp\_rdp** security group is missing. + +Step 2 Add external network to the project[](#step-2-add-external-network-to-the-project "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +To add external network to such project you must contact Customer Support by creating a ticket. Instructions how to do that are in article [Helpdesk and Support](../accountmanagement/Help-Desk-And-Support.html). The ticket should include project ID from the Projects list. To get the project ID, click on **Project** -> **API Access** + +![api_access.png](../_images/api_access.png) + +and then on button **View Credentials** on the right side. A window with user name, user ID, project name, project ID and authentication URL will appear. + +![user_credentials.png](../_images/user_credentials.png) + +Copy those values and put them into the email message in Helpdesk window. Click on button **Create Request** to send it: + +![add_ticket.png](../_images/add_ticket.png) + +Step 3 Add security group to the project[](#step-3-add-security-group-to-the-project "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +When the support answers, you will see **external** network in the network list. Then create security group and enable ports **22** (SSH) and **3389** (RDP) following the instructions in Prerequisite No. 3. Your security group should look like this: + +![screen07.png](../_images/screen07.png) + +Port 22 will enable SSH access to the instance, while port 3389 will enable access through RDP. SSH and RDP are protocols for accessing a virtual machine from local Linux or Windows machines, respectively. + +Step 4 Create network with router[](#step-4-create-network-with-router "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +The last step is to create a network with a router. See Prerequisite No. 4. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Your **testproject** is ready for creating new instances. For example, see articles: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html) + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html) + +If you want a new user to have access to **testproject**, the following articles will come handy: + +[Inviting new user to your Organization](../accountmanagement/Inviting-New-User.html). + +[Removing user from Organization](../accountmanagement/Removing-User-From-Organization.html). + +/accountmanagement/Accounts-and-Projects-Management. \ No newline at end of file diff --git a/docs/openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..dd733d3 --- /dev/null +++ b/docs/openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,49 @@ +How to access object storage using OpenStack CLI on CloudFerro Cloud[](#how-to-access-object-storage-using-openstack-cli-on-brand-name "Permalink to this headline") +===================================================================================================================================================================== + +Cloud computing offers the ability to handle large chunks of data, directly on the remote server. OpenStack module [Swift](https://docs.openstack.org/swift/latest/) was created expressly to enable access to unstructured data that can grow without bounds, with the following design goals in mind : + +> * durability, +> * scalability, +> * concurrency across the entire data set, +> * all while keeping the API simple. + +**Swift** is installed as an independent module but on the syntax level, it is used through the parameters of **openstack** command. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * How to install Swift +> * How to connect Swift to OpenStack cloud +> * Basic openstack operations with containers +> * Basic openstack operations with objects + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account, available at . If you want to follow up with articles about object storage on Horizon, you will this link too: . + +No. 2 **Install or activate openstack command** + +To be able to connect to the cloud, **openstack** command must be operational. If not installed already, use article [How to install OpenStackClient for Linux on CloudFerro Cloud](How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) + +No. 3 **Authenticate to OpenStack using application credentials** + +Then you have to authenticate your account to the cloud. The usual way is to activate **openstack** command using an RC file for on- or two-factor +authentication. That will not work in case of Swift module. It is authenticated with application credentials, as explained in article + +[How to generate or use Application Credentials via CLI on CloudFerro Cloud](../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html). + +No. 4 **Familiarity with object storage on** CloudFerro Cloud **OpenStack** + +This article is explaining the basics, using the Horizon interface: + +[How to use Object Storage on CloudFerro Cloud](../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html). + +Swift can be understood as the CLI tool for accessing object storage under OpenStack. + +No. 5 **Python installed** + +The following articles contain sections on how to install Python: \ No newline at end of file diff --git a/docs/openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..0250957 --- /dev/null +++ b/docs/openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html.md @@ -0,0 +1,107 @@ +How to Backup an Instance and Download it to the Desktop on CloudFerro Cloud OpenStack Hosting[](#how-to-backup-an-instance-and-download-it-to-the-desktop-on-brand-name-openstack-hosting "Permalink to this headline") +========================================================================================================================================================================================================================= + +First, you will need to setup the OpenStack CLI environment on the computer to which you want to download your instance. Depending on the operating system you are using, follow one of the links below: + +[How to install OpenStackClient for Linux on CloudFerro Cloud](How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) + +[How to install OpenStackClient GitBash for Windows on CloudFerro Cloud](How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html) + +Assume that you are + +> * logged into your CloudFerro Cloud hosting account with Horizon interface and that +> * you have created an instance called *vm-john-01*. + +![backupinst1.png](../_images/backupinst1.png) + +List Instances in Your Project[](#list-instances-in-your-project "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +List instances in your project using the following CLI command: + +``` +user@ubuntu:~$ openstack server list + +``` + +This will be the result: + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| ID | Name | Status | Networks | Image | Flavor | +| 72170eb7-cee4-41a3-beea-c7d208446130 | vm-john-01 | ACTIVE | test\_network=192.168.2.172, 64.225.128.53 | Ubuntu 20.04 LTS | eo1.medium | + +Create a Backup[](#create-a-backup "Permalink to this headline") +----------------------------------------------------------------- + +Now you can create a backup from command line interface (CLI) in the terminal (replace **72170eb7-cee4-41a3-beea-c7d208446130** with the ID of your instance): + +``` +user@ubuntu:~$ openstack server backup create --name backup-01 72170eb7-cee4-41a3-beea-c7d208446130 + +``` + +Note + +You can also add the **–rotate** parameter to the above command if you want to have control over the number of stored backups: + +``` +user@ubuntu:~$ openstack server backup create --name backup-01 --rotate 2 72170eb7-cee4-41a3-beea-c7d208446130 + +``` + +You can see the backup “backup-01” in + +![backupinst2.png](../_images/backupinst2.png) + +or with CLI command: + +``` +user@ubuntu:~$ openstack image list --private + +``` + +The result would be: + +``` ++--------------------------------------+-----------+--------+ +| ID | Name | Status | ++--------------------------------------+-----------+--------+ +| 747d720d-a6f4-4554-bf56-16183e5fb7fa | backup-01 | active | ++--------------------------------------+-----------+--------+ + +``` + +Download the Backup File[](#download-the-backup-file "Permalink to this headline") +----------------------------------------------------------------------------------- + +Disk image is a raw copy of the hard drive of your virtual machine. You can download it using the following command (replace **72170eb7-cee4-41a3-beea-c7d208446130** with the ID of your disk image): + +``` +user@ubuntu:~$ openstack image save --file backup-on-the-desktop 747d720d-a6f4-4554-bf56-16183e5fb7fa + +``` + +Upload the Backed Up File[](#upload-the-backed-up-file "Permalink to this headline") +------------------------------------------------------------------------------------- + +After that, you can upload backup of your file using the Horizon dashboard: + +Go to **Project → Compute → Images**. + +![backupinst3.png](../_images/backupinst3.png) + +Click on **“Create Image”**. + +![backupinst4.png](../_images/backupinst4.png) + +On this panel you must insert image name, choose backup file and backup format. Next click on “Create Image”. + +![backupinst5.png](../_images/backupinst5.png) + +You can also use CLI commands to upload the backup file: + +``` +user@ubuntu:~$ openstack image create --file path/to/backup + +``` \ No newline at end of file diff --git a/docs/openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..3cd56a0 --- /dev/null +++ b/docs/openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html.md @@ -0,0 +1,308 @@ +How to create a set of VMs using OpenStack Heat Orchestration on CloudFerro Cloud[](#how-to-create-a-set-of-vms-using-openstack-heat-orchestration-on-brand-name "Permalink to this headline") +=============================================================================================================================================================================================== + +Heat is an OpenStack component responsible for Orchestration. Its purpose is to deliver automation engine and optimize processes. + +Heat receives commands through templates which are text files in *yaml* format. A template describes the entire infrastructure that you want to deploy. The deployed environment is called a *stack* and can consist of any combination out of the **102** different resources that are available in OpenStack. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Typical parts of a Heat template +> * Basic template for using Heat +> * How to get data for Heat Template +> * Using Heat with CLI +> * Using Heat with GUI +> * More advanced template for Heat + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Installed Python and its virtualenv** + +If you want to use Heat through CLI commands, Python must be installed and its virtual environment activated. See article [How to install Python virtualenv or virtualenvwrapper on CloudFerro Cloud](../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html). + +If you have never installed one of the OpenStack clients, see :[How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html). + +Always use the latest value of image id[](#always-use-the-latest-value-of-image-id "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +From time to time, the default images of operating systems in the CloudFerro Cloud cloud are upgraded to the new versions. As a consequence, their **image id** will change. Let’s say that the image id for Ubuntu 20.04 LTS was **574fe1db-8099-4db4-a543-9e89526d20ae** at the time of writing of this article. While working through the article, you would normally take the **current** value of image id, and would use it to replace **574fe1db-8099-4db4-a543-9e89526d20ae** throughout the text. + +Now, suppose you wanted to automate processes under OpenStack, perhaps using Heat, Terraform, Ansible or any other tool for OpenStack automation; if you use the value of **574fe1db-8099-4db4-a543-9e89526d20ae** for image id, it would remain **hardcoded** and once this value gets changed during the upgrade, the automated process may stop to execute. + +Warning + +Make sure that your automation code is using the **current value** of an OS image id, not the hardcoded one. + +Basic template for using Heat[](#basic-template-for-using-heat "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Using the following snippet, you can create one virtual machine, booted from ephemeral disk. Create a text file called **template.yaml** with your favorite text editor and save it to disk: + +``` +heat_template_version: 2015-04-30 + +resources: + instance: + type: OS::Nova::Server + properties: + flavor: eo1.xsmall + image: Ubuntu 18.04 LTS + networks: + - network: + - network: + key_name: + security_groups: + - allow_ping_ssh_icmp_rdp + - default + +``` + +Important + +*Yaml* format does not allow for tabs, you must enter spaces instead. + +Typical parts of a Heat template[](#typical-parts-of-a-heat-template "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +Here are the basic elements of a Heat template: + +**heat\_template\_version** +: The exact version of heat template. Each of them varies in many ways (including support for various modules, additional parameters, customization etc). See **Orchestration** -> **Template Versions**. + +**resources** +: Entry to commence providing particular components for deployment. + +**instance** +: Name of resource (you can type in anything on your own). + +**type** +: Definition of an OpenStack component (a comprehensive list is under **Orchestration** -> **Resource Types**) + +**properties** +: Required parameters for deploying a component. + +Note + +Your account will normally have a network starting with **cloud\_** but it may also have other networks. In the following examples, we use network called **eodata\_** as an example of an additional network that can be added while creating and using Heat templates. + +How to get data for Heat template[](#how-to-get-data-for-heat-template "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +Templates need data for images, flavor networks, key pairs, security groups and so on. You would normally know all these elements in advance, or you could “look around” at various parts of OpenStack environment: + +| | | +| --- | --- | +| flavor | **Compute** -> **Instances** -> **Launch Instance** -> **Flavor** | +| image | **Compute** -> **Instances** -> **Launch Instance** -> **Source** | +| networks | **Network** -> **Networks** -> *cloud* and *eodata* networks for your domain | +| key\_name | **Compute** -> **Key Pairs** | +| security\_groups | **Network** -> **Security Groups** | + +You can work with Heat in two ways: + +> * through Command Line Interface (CLI), with **python-heatclient** preinstalled and +> * interactively, through Horizon commands. + +Using Heat with CLI[](#using-heat-with-cli "Permalink to this headline") +------------------------------------------------------------------------- + +Assuming you have + +> * installed Python and +> * activated its working environment + +as explained in Prerequisite No. 2, run **pip** command to install **python-heatclient**: + +``` +pip install python-heatclient + +``` + +To run a prepared template in order to deploy a stack, this is what a general command would look like: + +``` +openstack stack create -t template.yaml + +``` + +where **-t** assigns template for deployment and **** defines name for the stack. + +As a result, a new Stack would be executed and a new instance would be created. For example, the command + +``` +openstack stack create -t template.yaml heat-test2 + +``` + +would produce the following output: + +![heat-test2.png](../_images/heat-test2.png) + +In Horizon, this is what you would see under **Orchestration** -> **Stacks**: + +![heat_test2_stacks.png](../_images/heat_test2_stacks.png) + +A new instance would be created under **Compute** -> **Instances**: + +![heat_test2_instances.png](../_images/heat_test2_instances.png) + +Using Heat with GUI[](#using-heat-with-gui "Permalink to this headline") +------------------------------------------------------------------------- + +Log in to the Horizon dashboard, choose **Orchestration** and then **Stacks** tab: + +![stacks_menu.png](../_images/stacks_menu.png) + +Navigate to the right part of the screen, click on button ![click_button_launch_stack](_images/click_button_launch_stack.png) and bring **Select Template** window to the screen. + +Enroll Template Source selector and choose a particular file, Direct Input or URL to your template. + +![orch4.png](../_images/orch4.png) + +Enter the text of the template you copied from file **template.yaml** directly into the form: + +![select_template_yaml.png](../_images/select_template_yaml.png) + +Provide a name of your stack and your openstack password: + +![launch_stack.png](../_images/launch_stack.png) + +As a result, a new Heat template will have been created: + +![create_new_template.png](../_images/create_new_template.png) + +By creating a stack in Horizon you have also executed that template. The result is that a new instance has been created – see it under **Compute** -> **Instances**: + +![heat_instance.png](../_images/heat_instance.png) + +We end up with two stacks and two new instances, once using a CLI and the other time, using a GUI. + +Create four VMs using an advanced Heat template[](#create-four-vms-using-an-advanced-heat-template "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------- + +In the following example we will attach parameters and then create ResourceGroup with counter, a VM booted from Cinder Volume and several predefined outputs. In parameter **count** we state that we want to generate **4** instances at once, which will yield us the automation that we wanted in the first place. Save the following code as **template4.yaml**: + +``` +heat_template_version: 2015-04-30 + +parameters: + key_name: + type: string + label: sshkey + description: SSH key to be used for all instances + default: + image_id: + type: string + description: Image to be used. Check all available options in Horizon dashboard or, with CLI, use openstack image list command. + default: Ubuntu 18.04 LTS + private_net_id: + type: string + description: ID/Name of private network + default: + +resources: + Group_of_VMs: + type: OS::Heat::ResourceGroup + properties: + count: 4 + resource_def: + type: OS::Nova::Server + properties: + name: my_vm%index% + flavor: eo1.xsmall + image: { get_param: image_id } + networks: + - network: { get_param: private_net_id } + key_name: { get_param: key_name } + security_groups: + - allow_ping_ssh_icmp_rdp + - default + + VOL_FAQ: + type: OS::Cinder::Volume + properties: + name: vol + size: 20 + image : { get_param: image_id } + + With_volume: + type: OS::Nova::Server + properties: + flavor: eo1.xsmall + block_device_mapping: [{"volume_size": 20, "volume_id": { get_resource: VOL_FAQ }, "delete_on_termination": False, "device_name": "/dev/vda" }] + networks: + - network: { get_param: private_net_id } + key_name: { get_param: key_name } + security_groups: + - allow_ping_ssh_icmp_rdp + - default + image : { get_param: image_id } + +outputs: + SERVER_DETAILS: + description: Shows details of all virtual servers. + value: { get_attr: [ Group_of_VMs, show ] } + +``` + +The first step is to create a real volume (called VOL\_FAQ) and the second is to create a VM (With\_volume). + +**Explanation** + +**Parameters** +: Here you provide default values (**key\_name**, **image\_id**, **private\_net\_id** in this case) and later inject them into resource definitions. The syntax is: + + ``` + {get param: param_name } + + ``` + +**ResourceGroup** +: Component being used for repeating deployment, e.g two identical VM’s. + +**Count** +: Defines a variable for iterative operations. + +**resource\_def** +: Starting statement for defining group resources. + +**%index%** +: This is how you add iterative number to the VM name, increasing values starting from 0. + +**block\_device\_mapping** +: Property to define a bootable Cinder volume for instance. + +**outputs** +: Additional information concerning deployed elements of the stack. In this case it returns a “show” attribute output. You can examine this kind of information by using openstack stack output list. Available attributes for every component [can be found here.](https://docs.openstack.org/heat/latest/template_guide/openstack.html). + +Execute the template with the following command: + +``` +openstack stack create -t template4.yaml four + +``` + +The name of the stack will be *four*. This is the result in CLI window: + +![create_heat_4.png](../_images/create_heat_4.png) + +Under **Compute** -> **Instance** you would see five new instances created: + +![four_created.png](../_images/four_created.png) + +Four of them have names *my\_vm0*, *my\_vm1*, *my\_vm1* and *my\_vm1*, as defined in line **name: my\_vm%index%** in the template. The fifth is called **four-With\_volume-lrejw222kfvi**. Its name starts the same as the name of the template itself while the rest is automatically generated. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can write your own templates as *yaml* files or you can use option **Orchestration** -> **Template Generator**, which will enable you to enter components in an interactive way: + +![template_generator.png](../_images/template_generator.png) + +Further explanation of this option is out of scope of this article. \ No newline at end of file diff --git a/docs/openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..213ef5d --- /dev/null +++ b/docs/openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,122 @@ +How to create instance snapshot using OpenStack CLI on CloudFerro Cloud[](#how-to-create-instance-snapshot-using-openstack-cli-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================== + +In this article, you will learn how to create instance snapshot on CloudFerro Cloud cloud, using OpenStack CLI. + +Instance snapshots allow you to archive the state of the virtual machine. You can, then, use them for + +> * backup, +> * migration between clouds +> * disaster recovery and/or +> * cloning environments for testing or development. + +We cover both types of storage for instances, *ephemeral* and *persistent*. + +The plan[](#the-plan "Permalink to this headline") +--------------------------------------------------- + +In reality, you will be using the procedures described in this article with the already existing instances. + +However, to get a clear grasp of the process, while following this article you are going to create two new instances, one with *ephemeral* and the other with *persistent* type of storage. Let their names be **instance-which-uses-ephemeral** and **instance-which-uses-volume**. You will create an instance snapshot for each of them. + +If you are only interested in one of these types of instances, you can follow its respective section of this text. + +It goes without saying that after following a section about one type of virtual machine you can clean up the resources you created to, say, save costs. + +Or you can keep them and use them to create an instance out of it using one of articles mentioned in What To Do Next. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Ephemeral storage vs. persistent storage** + +Please see article [Ephemeral vs Persistent storage option Create New Volume on CloudFerro Cloud](../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html) to understand the basic difference between ephemeral and persistent types of storage in OpenStack. + +No. 3 **Instance with ephemeral storage** + +You need a virtual machine hosted on CloudFerro Cloud cloud. + +You can create an instance with ephemeral storage by following this article: [How to create a VM using the OpenStack CLI client on CloudFerro Cloud cloud](../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html) + +The actual command used to create an instance from that article was + +``` +openstack server create \ +--image Debian-custom-upload \ +--flavor eo1.small \ +--key-name ssh-key \ +--network cloud_00734_1 \ +--network eodata \ +--security-group default \ +--security-group allow_ping_ssh_icmp_rdp \ +Test-Debian + +``` + +In the examples in this article, we are using a default image **Ubuntu 22.04 LTS**. + +With ephemeral storage, only one new instance is created. + +No. 4 **Instance with persistent storage** + +When creating an instance with persistent storage, you just add one new option to the above command; the option is **–boot-from-volume** followed by a + +> * space and the +> * desired size of the new volume in gigabytes. + +Make sure to enter the amount of storage sufficient for your needs. + +You can also look at storage size available with your chosen virtual machine flavor for guidance (**openstack flavor list** command, column **Disk**) + +For instance, if you want your boot volume to have 16 GB, add the following: + +``` +--boot-from-volume 16 + +``` + +The complete command would, then, look like this: + +``` +openstack server create \ +--image Debian-custom-upload \ +--flavor eo1.small \ +--key-name ssh-key \ +--network cloud_00734_1 \ +--network eodata_00734_1 \ +--security-group default \ +--security-group allow_ping_ssh_icmp_rdp \ +--boot-from-volume 16 \ +Test-Debian + +``` + +In the examples in this article, we are using a default image **Ubuntu 22.04 LTS**. + +With persistent storage, one instance and one volume are created: + +> * a special kind of instance (with no ephemeral storage) and +> * the volume that is attached to that instance. + +The instance will boot from the volume that was attached during the creation of instance. + +Otherwise, an instance can have two or more volumes attached to it, however, only one will serve as its boot drive. + +No. 5 **How to delete resources** + +If you want to learn how to delete instances, snapshots, volumes and other OpenStack objects, please have a look at the following articles: + +/networking/How-to-correctly-delete-all-the-resources-in-the-project-via-OpenStack-commandline-Clients-on-CloudFerro-Cloud. + +[How to create or delete volume snapshot on CloudFerro Cloud](../datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html). + +No. 6 **OpenStack CLI client** + +You need to have OpenStack CLI client installed. One of the following articles should help you: \ No newline at end of file diff --git a/docs/openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..5f35aa0 --- /dev/null +++ b/docs/openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html.md @@ -0,0 +1,304 @@ +How to install OpenStackClient GitBash for Windows on CloudFerro Cloud[](#how-to-install-openstackclient-gitbash-for-windows-on-brand-name "Permalink to this headline") +========================================================================================================================================================================= + +In this tutorial, you start with a standard Windows installation, then install the OpenStack CLI client and end up connecting to your project on CloudFerro Cloud cloud. + +> For another way of installing OpenStack CLI on Windows, see article [How to install OpenStackClient on Windows using Windows Subsystem for Linux on CloudFerro Cloud OpenStack Hosting](How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html). However: + +* using Git Bash is simpler than using Windows Subsystem for Linux and is +* providing a more straightforward access to your local file system. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Installing the required software (Python 3, PIP, Git for Windows and the appropriate compilers) +> * Creating an isolated Python environment for installing the OpenStack CLI client +> * Installing the OpenStack CLI client +> * Authenticating the OpenStack CLI client to the cloud +> * Executing a simple command to test whether the process was successful + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Computer running Microsoft Windows** + +Your computer or virtual machine must be running Microsoft Windows 10 version 1909 or Windows 11. Also, Windows Server 2016, 2019 and 2022 are supported. The reason for that are the requirements of Microsoft Visual Studio. + +Obtaining a valid license for Microsoft C++ Build Tools and other software mentioned here, is outside of scope of this text. + +Installing Microsoft C++ Build Tools, as described in this article, might require more than 10 GiB of hard drive space. The exact amount is subject to change. During this process, make sure that you do not run out of storage. + +No. 3 **Basic knowledge of the Linux terminal** + +You will need basic knowledge of Linux command line. + +No. 4 **RC file downloaded** + +You need to download the RC file from your Horizon dashboard. To do that, follow section **How to download the RC file** of the following article: /gettingstarted/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication. + +This file must be present on the machine on which you intend to use the OpenStack CLI client. + +Step 1: Download and Install Python[](#step-1-download-and-install-python "Permalink to this headline") +-------------------------------------------------------------------------------------------------------- + +There are two ways of obtaining Python on CloudFerro Cloud cloud: + +> * It may come preinstalled on virtual machines that were created using one of the default Windows images. +> * You may download and install the latest version from the Internet. + +The latter solution will either install Python anew or update the existing installation, so it is still a recommended step. + +If you are going to use your own computer, follow the instructions below if you don’t have Python installed. + +Start your Internet browser and open + +Hover your mouse over the **Downloads** button and choose Windows from the menu that has just appeared. + +Pick up the latest version for Python. + +Download it and run that **.exe** file. Make sure to have options at the bottom of the window selected and click **Customize installation**. + +![git-bash01_creodias.png](../_images/git-bash01_creodias.png) + +In the next screen, select all the **Optional Features**: + +![git-bash02_creodias.png](../_images/git-bash02_creodias.png) + +Click **Next**. + +In the screen **Advanced Options**, select what is selected on the screenshot below and make sure that the installation location is in **Program Files** directory: + +![git-bash03_creodias.png](../_images/git-bash03_creodias.png) + +Click **Install** and wait until the installation is completed: + +![git-bash04_creodias.png](../_images/git-bash04_creodias.png) + +On the last screen, click option **Disable path length limit**: + +![git-bash05_creodias.png](../_images/git-bash05_creodias.png) + +The button **Disable path length limit** should disappear. Click **Close**. + +Open Windows command prompt and execute **python** command in it to check whether the installation was successful. You should see output similar to this: + +![git-bash17_creodias.png](../_images/git-bash17_creodias.png) + +Close the command prompt. + +Step 2: Install Git Bash and pip[](#step-2-install-git-bash-and-pip "Permalink to this headline") +-------------------------------------------------------------------------------------------------- + +Git Bash for Windows is a set of programs that emulates Linux terminal, allowing you to use common Linux commands **ls**, **source**, **mv** and others. + +It is part of Git for Windows. Download that software from and execute the installer. + +During the installation keep the default options selected. + +After installation, a Git Bash entry should appear in Start menu: + +![git-bash06_creodias.png](../_images/git-bash06_creodias.png) + +Other programs in the suite are Git CMD, Git GUI etc. + +The installation of Python and its suite of programs requires you to additionally install **pip** and update the necessary PythonSSL certificates. + +Step 3: Install pip and update the PythonSSL certificates[](#step-3-install-pip-and-update-the-pythonssl-certificates "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------- + +**pip** is a tool for managing and installing Python images. + +Download **get-pip.py** from . If it opens in your browser as plain text document, right click anywhere on it in the browser and use the **Save as…** or similar option to save it on your computer. + +![git-bash07_creodias.png](../_images/git-bash07_creodias.png) + +Run the script by opening it in **Python**. If **Python** is not the default piece of software used for opening **.py** files on your system, right-click the file and use the **Open with…** or similar option and choose **Python** there. + +It will install **pip**. The installation process can be monitored in a terminal window. + +In order to test whether the installation was successful, use **Start** menu to start **Git Bash** and type the following command: + +``` +pip -V + +``` + +Your output should contain the version of **pip** that you have: + +![git-bash09_creodias.png](../_images/git-bash09_creodias.png) + +Now update PythonSSL certificates that you have on your computer: + +``` +pip install -U requests[security] + +``` + +![git-bash10_creodias.png](../_images/git-bash10_creodias.png) + +Step 4: Install Microsoft C++ Build Tools[](#step-4-install-microsoft-c-build-tools "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------ + +Microsoft C++ Build Tools are required to install the OpenStack CLI client using **pip** on Windows. + +Enter the following website: + +Click **Download Build Tools**. Execute the downloaded **.exe** file. + +During installation, choose the **Desktop development with C++** (which was a correct option at the time of writing): + +![git-bash11_creodias.png](../_images/git-bash11_creodias.png) + +Click **Install**. Wait until the installation process is completed. + +Warning + +The installation process might take a long time. + +Reboot your computer if the installer prompts you to do so. + +Step 5: Install virtualenv and the OpenStack CLI client[](#step-5-install-virtualenv-and-the-openstack-cli-client "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------ + +**virtualenv** allows you to perform Python operations in an isolated environment. In order to install it, open Git Bash if you previously closed it or rebooted your computer, and execute the following command: + +``` +pip install virtualenv + +``` + +With **cd** command enter the directory in which you want to store the environment in which the OpenStack CLI client will be running. You will need it later on, so make it easily accessible, for example: + +``` +cd C:/Users/Administrator + +``` + +Execute the following command to create the virtual environment **openstack\_cli** which will be used for the OpenStack CLI client: + +``` +virtualenv openstack_cli + +``` + +Note + +You must supply the name of the environment (here, **openstack\_cli**) but what it will be is completely up to you. + +A directory called **openstack\_cli** should appear in the current folder. It will contain files needed for your isolated environment. In order to enter that environment, run **source** command on the **activate** file which is in the **Scripts** folder found in the folder with your virtual environment: + +``` +source openstack_cli/Scripts/activate + +``` + +From now on, the name of your isolated environment - **openstack\_cli** - will be in brackets before each command prompt, indicating that you are inside it. + +![git-bash12_creodias.png](../_images/git-bash12_creodias.png) + +Closing the terminal and reopening will drop you from that environment. + +### How Git Bash terminal commands differ from those in Windows[](#how-git-bash-terminal-commands-differ-from-those-in-windows "Permalink to this headline") + +In GitBash, there are two ways of inserting text from clipboard: + +> * key combination **Shift+Ins** or +> * right-click the Git Bash window and select **Paste** from the displayed menu. + +The usual Windows commands such as **CTRL+V** or **CTRL+Shift+V**, **won’t work** in Git Bash window. + +Git Bash emulates UNIX-based systems so while you are in it, use forward slashes and not the typical Windows backward slashes. + +Step 6: Download and prepare jq[](#step-6-download-and-prepare-jq "Permalink to this headline") +------------------------------------------------------------------------------------------------ + +To authenticate the OpenStack CLI client in the next step, a program called **jq** will be needed. It is a JSON preprocessor, running from command line. To install, navigate to using your Internet browser. + +Download the latest 64-bit executable version of **jq** for Windows. + +A file with **.exe** extension should be downloaded. Rename it to simply **jq** (make sure that it still has the **.exe** extension). + +Navigate to its location using the **cd** command in Git Bash. Do it in a similar way as you would on a Linux command line. Execute the following command: + +``` +mv jq.exe /usr/bin + +``` + +This should allow you to use **jq** with the RC file easily. + +Step 7: Install and configure the OpenStack CLI client[](#step-7-install-and-configure-the-openstack-cli-client "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------- + +Without leaving Git Bash, while still inside the **openstack\_cli** virtual environment, execute the following command: + +``` +pip install python-openstackclient + +``` + +Wait until the process is completed. As the result, you will be able to run **openstack** command on terminal prompt. It, however, won’t have access to the CloudFerro Cloud cloud, so the next step is to authenticate to the cloud. + +Navigate to the location of the RC file which you downloaded while following Prerequisite No. 4 and execute the **source** command on it. It could look like this (if the name of your RC file is **main-openrc.sh**): + +``` +source main-openrc.sh + +``` + +After that, you will receive the prompt for your password. Enter it and press **Enter** (while typing the password, no characters should appear). + +If your account has two-factor authentication enabled, you will get a prompt for the six-digit code. Enter it and press **Enter**. + +Here is what the two step process of authentication looks like for an RC file called **main-openrc.sh**: + +![enter_the_six_digit_code2.png](../_images/enter_the_six_digit_code2.png) + +On the screenshot above, the username and project name were hidden for privacy reasons. + +In order to test whether the OpenStack CLI client works, list virtual machines you currently operate. The command is: + +``` +openstack server list + +``` + +The output should contain a table containing virtual machines from your project. + +Reentering the Isolated Python Environment[](#reentering-the-isolated-python-environment "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +To run the OpenStack CLI client again, say, after you might have closed the Git Bash window, or have had shut down or restarted Windows, you would have to repeat the same commands you entered above (replace **C:/Users/Administrator** with the path containing your **openstack\_cli** folder). + +``` +cd C:/Users/Administrator +source openstack_cli/Scripts/activate + +``` + +After that, execute the **source** command on your RC file in the same way as previously. + +You can also create a batch file to automate reentering the Python environment. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +The article [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html) will give you another procedure to install CLI and connect it to the cloud. It also contains several examples of using the CLI commands. + +Other articles of interest: + +[How to Create and Configure New Openstack Project Through Horizon on CloudFerro Cloud Cloud](How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html) + +[How to create a set of VMs using OpenStack Heat Orchestration on CloudFerro Cloud](How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html) + +Using CLI interface for Kubernetes clusters: + +[How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](../kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) + +Also see + +[How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html) \ No newline at end of file diff --git a/docs/openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..271554f --- /dev/null +++ b/docs/openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,29 @@ +How to install OpenStackClient for Linux on CloudFerro Cloud[](#how-to-install-openstackclient-for-linux-on-brand-name "Permalink to this headline") +===================================================================================================================================================== + +The OpenStack CLI client allows you to manage OpenStack environments using the command line interface. Its functions include: + +> * Creating, starting, shutting down, shelving, deleting, rebooting virtual machines +> * Assigning a floating IP to your virtual machine +> * Listing available resources, including volumes, virtual machines and floating IPs + +You can also automate these operations using scripts. + +This article covers two methods of installing this piece of software on Ubuntu. The first method should be more convenient and sufficient for most needs. The second method is for advanced use cases, such as: + +> * keeping multiple versions of the OpenStack CLI client ready to use on the same computer or +> * needing more advanced features than what Ubuntu packages provide and +> * having to use the OpenStack CLI client on a Linux distribution which does not support the installation method described in the first method. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Linux installed on your computer** + +You need to have Linux installed on your local computer or a virtual machine. This article was written for Ubuntu 22.04 LTS and Python 3. Instructions for other Linux distributions might be different. + +If you choose a virtual machine, you can run it yourself, or it can be, say, a virtual machine running on CloudFerro Cloud cloud. If you choose this latter option, the following articles might be of help for you: \ No newline at end of file diff --git a/docs/openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html.md b/docs/openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html.md new file mode 100644 index 0000000..2ea5615 --- /dev/null +++ b/docs/openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html.md @@ -0,0 +1,305 @@ +How to install OpenStackClient on Windows using Windows Subsystem for Linux on CloudFerro Cloud OpenStack Hosting[](#how-to-install-openstackclient-on-windows-using-windows-subsystem-for-linux-on-brand-name-openstack-hosting "Permalink to this headline") +=============================================================================================================================================================================================================================================================== + +In this tutorial, you will control your OpenStack environment in a deeper and more precise way using the CLI (Command Line Interface). Of course, you can use the Horizon GUI (Graphical User Interface) running in your browser, but the CLI includes additional features like the ability to use scripts for more automated management of your environment. + +The instructions for installing Windows Subsystem for Linux are based on the official Windows documentation found at . + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Installing Windows Subsystem for Linux on Microsoft Windows +> * Installing the OpenStack CLI client and authenticating + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **Computer running Microsoft Windows** + +Your computer must be running Microsoft Windows. This article is written for Windows Server 2019 version 1709 or later. The instructions for the following versions are linked in the appropriate location of this article: + +> * Windows 10 version 1903 up to and excluding version 2004 +> * Windows 10 version 2004 or later (Build 19041), Windows 11 +> * Windows Server 2022 + +No. 3 **Optional – software for 2FA authentication** + +Your account at CloudFerro Cloud cloud may have two-factor authentication enabled. It means that apart from the usual username and password combination, you also need software to generate the TOTP – the six-digit code for the additional, second step of authentication. This article will provide additional technical details: [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html). + +Step 1: Check the version of Windows[](#step-1-check-the-version-of-windows "Permalink to this headline") +---------------------------------------------------------------------------------------------------------- + +Right-click on your start menu and left-click “System”. + +A screen will appear in which you will see the version of your Microsoft Windows operating system. Memorize it or write it somewhere down. + +Step 2: Install Ubuntu on Windows Subsystem for Linux[](#step-2-install-ubuntu-on-windows-subsystem-for-linux "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------------- + +Note + +The following instructions from this step are for Windows Server 2019 version 1709 or later. If you are running a different operating system, please follow the instructions found under the appropriate link and skip to Step 3: + +> * Windows Server 2022 - section **Install WSL on Windows Server 2022** +> * Windows 10 version 1903 up to and excluding version 2004 - +> * Windows 10 version 2004 or later (Build 19041), Windows 11 - + +Enter the following website: . Download Ubuntu 20.04 using the provided link. This tutorial assumes that your browser saved it in your **Downloads** directory - if that is not the case, please modify the instructions accordingly. + +Locate the downloaded file: + +![wsl01_creodias.png](../_images/wsl01_creodias.png) + +Right-click it and select the option **Rename**. + +![wsl02_creodias.png](../_images/wsl02_creodias.png) + +Rename the downloaded file to **Ubuntu.zip**: + +![wsl03_creodias.png](../_images/wsl03_creodias.png) + +Right-click the file and select **Extract All…**. + +![wsl04_creodias.png](../_images/wsl04_creodias.png) + +In the wizard that appeared do not change any options and click **Extract**: + +![wsl05_creodias.png](../_images/wsl05_creodias.png) + +A directory called **Ubuntu** should have appeared: + +![wsl06_creodias.png](../_images/wsl06_creodias.png) + +Enter that folder and view its content: + +![wsl07_creodias.png](../_images/wsl07_creodias.png) + +Memorize or write somewhere down the name of the **.appx** file which ends with **x64**. + +Open your **Start** menu. Right-click the entry **Windows PowerShell** and select **Run as administrator**: + +![wsl08_creodias.png](../_images/wsl08_creodias.png) + +In the displayed window type the following command and press Enter: + +``` +Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux + +``` + +The following progress bar should have appeared: + +![wsl09_creodias.png](../_images/wsl09_creodias.png) + +After the end of the process you will be asked if you want to restart your computer to complete the operation: + +![wsl10_creodias.png](../_images/wsl10_creodias.png) + +Make sure that the restart will not cause any disruptions and press **Y** to restart. + +During the reboot you will see the following process message: + +![wsl11_creodias.png](../_images/wsl11_creodias.png) + +Once the reboot is completed, start the PowerShell again as described previously. + +Run the following command (replace **Ubuntu.appx** with the name of your **.appx** file which you memorized or wrote somewhere down previously): + +``` +Add-AppxPackage .\Downloads\Ubuntu\Ubuntu.appx + +``` + +During the process, you will see the status bar similar to this: + +![wsl12_creodias.png](../_images/wsl12_creodias.png) + +Once the process is finished, execute the following command (replace the **C:\Users\Administrator\Ubuntu** path with the location of your **Ubuntu** folder): + +``` +$userenv = [System.Environment]::GetEnvironmentVariable("Path", "User") +[System.Environment]::SetEnvironmentVariable("PATH", $userenv + ";C:\Users\Administrator\Ubuntu", "User") + +``` + +Your newly installed Ubuntu should appear in your **Start** menu: + +![wsl13_creodias.png](../_images/wsl13_creodias.png) + +Run it. You will see the following message: + +![wsl14_creodias.png](../_images/wsl14_creodias.png) + +Wait until this process finishes. After that, you will get a prompt asking you for your desired username (which is to be used in the installed Ubuntu): + +![wsl15_creodias.png](../_images/wsl15_creodias.png) + +Type it and press Enter. You will now be asked to provide the password for that account: + +![wsl16_creodias.png](../_images/wsl16_creodias.png) + +Note + +Your password will not be visible as you type, not even as masking characters. + +Input your password and press Enter. You will then be asked to type it again: + +![wsl17_creodias.png](../_images/wsl17_creodias.png) + +If you typed the same password twice, it will be set as the password for that account. You wil get the following message as confirmation: + +![wsl18_creodias.png](../_images/wsl18_creodias.png) + +Wait for a short time. Eventually your Linux environment will be ready: + +![wsl19_creodias.png](../_images/wsl19_creodias.png) + +Step 3: Install OpenStack CLI in an isolated Python environment[](#step-3-install-openstack-cli-in-an-isolated-python-environment "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Now that you have installed Windows Subsystem on Linux running Ubuntu on your Windows computer, it is time to install OpenStack CLI. + +Update the software running on your Ubuntu: + +``` +sudo apt update && sudo apt upgrade + +``` + +Once the process is finished, install the **python3-venv** package to create a separate Python environment: + +``` +sudo apt install python3-venv + +``` + +Create a virtual environment in which you will have OpenStack CLI installed: + +``` +python3 -m venv openstack_cli + +``` + +Enter your new virtual environment: + +``` +source openstack_cli/bin/activate + +``` + +Upgrade **pip** to the latest version: + +``` +pip install --upgrade pip + +``` + +Install the **python-openstackclient** package: + +``` +pip install python-openstackclient + +``` + +Verify that the OpenStack CLI works by viewing its help: + +``` +openstack --help + +``` + +If the command shows its output using a pager, you should be able to use the arrows (or vim keys - **J** and **K**) to scroll and **Q** to exit. + +If everything seems to work, time to move to the next step - authentication to your user account on CloudFerro Cloud. + +Step 4: Download your OpenStack RC File[](#step-4-download-your-openstack-rc-file "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------- + +Login to CloudFerro Cloud hosting account with Horizon interface . + +Click on your username in the upper right corner. You will see the following menu: + +![wsl20_creodias.png](../_images/wsl20_creodias.png) + +If your account has two factor authentication enabled, click the option **OpenStack RC File (2FA)**. If, however, it does not have it enabled, use the **OpenStack RC File** option. + +The RC file will be downloaded. Memorize or write somewhere down the name of that file. Move this file to the root location of your **C:** drive. + +Step 5: Move the RC file to your Ubuntu environment[](#step-5-move-the-rc-file-to-your-ubuntu-environment "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------- + +Return to your **Ubuntu** window. + +You will now copy your RC file to your Ubuntu environment. Since Windows Subsystem for Linux mounts the **C:** drive under **/mnt/c**, the command for copying your RC file to your Ubuntu environment is as follows (replace **main-openrc.sh** with the name of your RC file): + +``` +cp /mnt/c/main-openrc.sh $HOME + +``` + +If your account uses two-factor authentication, you will need **jq** to activate access to your cloud environment. To install **jq**, execute: + +``` +sudo apt install -y jq + +``` + +Now use the **source** command on this file to begin the authentication process (replace **main-rc.sh** with the name of your RC file): + +``` +source main-openrc.sh + +``` + +You will see the prompt for password to your CloudFerro Cloud account. Type your password there and press Enter (the password is still being accepted even if you do not see the characters being typed). + +If your account has two factor authentication enabled, you will also see the prompt for your six-digit code. Open software which you use for generating such codes (for example KeePassXC or FreeOTP) and find your code there, as usual. Make sure that you enter it before it expires. If you think that you will not manage to enter your current code, wait until a new one is generated. + +After having entered your code, press Enter. + +Now you can test whether you have successfully authenticated by listing your VMs: + +``` +openstack server list + +``` + +How to run this environment later?[](#how-to-run-this-environment-later "Permalink to this headline") +------------------------------------------------------------------------------------------------------ + +If you close the window with Ubuntu and reopen it, you will see that you are no longer in the **openstack\_cli** environment you created and thus no longer have access to OpenStack. You will need to reenter the **openstack\_cli** environment and reauthenticate. + +After reopening the Ubuntu Window, execute the **source** command on the file used for entering you **openstack\_cli** environment, just like previously: + +``` +source openstack_cli/bin/activate + +``` + +Now, reauthenticate by invoking the **source** comand on your **RC** file (replace **main-openrc.sh** with the name of your RC file): + +``` +source main-openrc.sh + +``` + +Type your password and press Enter. You should now be able execute the OpenStack CLI commands as usual. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +After installing the OpenStack CLI client and activating your new RC file, you can use other articles to perform operations on CloudFerro Cloud cloud: + +[How to create a set of VMs using OpenStack Heat Orchestration on CloudFerro Cloud](How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html) + +[Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud](../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html) + +[How to upload your custom image using OpenStack CLI on CloudFerro Cloud](../cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html) + +[How to create a VM using the OpenStack CLI client on CloudFerro Cloud cloud](../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html) + +[How To Use Command Line Interface for Kubernetes Clusters On CloudFerro Cloud OpenStack Magnum](../kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html) \ No newline at end of file diff --git a/docs/openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..1fa251a --- /dev/null +++ b/docs/openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,17 @@ +How to move data volume between VMs using OpenStack CLI on CloudFerro Cloud[](#how-to-move-data-volume-between-vms-using-openstack-cli-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================== + +Volumes are used to store data and those data can be accessed from a virtual machine to which the volume is attached. To access data stored on a volume from another virtual machine, you need to disconnect that volume from virtual machine to which it is currently connected, and connect it to another instance. + +This article uses OpenStack CLI client to transfer volumes between virtual machines which are in the same project. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **OpenStack CLI client** + +To be able to use the OpenStack CLI client, you need to have it installed. One of these articles should help: \ No newline at end of file diff --git a/docs/openstackcli/How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..d0a7667 --- /dev/null +++ b/docs/openstackcli/How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html.md @@ -0,0 +1,382 @@ +How to share private container from object storage to another user on CloudFerro Cloud[](#how-to-share-private-container-from-object-storage-to-another-user-on-brand-name "Permalink to this headline") +========================================================================================================================================================================================================= + +You can create your own private containers in Object Store of your projects and you can grant access to other users. + +If you want to limit the access for chosen users to specific containers, the other users have to be the members of other projects (it is recommended one user or group of users per one project). + +The project can be in one or more domains. + +Otherwise, if users are members of the same project, they see all containers in that project and you cannot limit access to specific containers. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Hosting** + +You need a CloudFerro Cloud hosting account with Horizon interface . + +No. 2 **OpenStack client installed and connected to the cloud** + +The following article will help you install Python and OpenStack client called **openstack** and will also help you connect to the cloud [How to install OpenStackClient for Linux on CloudFerro Cloud](How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html)). + +No. 3 **Knowledge of downloading and working with RC files** + +To be able to share private containers, you will have to manipulate RC files from the cloud. The following article will provide technical details: + +[How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html) + +No. 4. **Using OpenStack Swift module** + +The OpenStack Object Store module, known as *Swift*, allows you to store and retrieve data with a simple API. It’s built for scale and is optimized for durability, availability, and concurrency across the entire data set. Swift is ideal for storing unstructured data that can grow without bound. + +See [How to access object storage using OpenStack CLI on CloudFerro Cloud](How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html) + +Setting up the test example[](#setting-up-the-test-example "Permalink to this headline") +----------------------------------------------------------------------------------------- + +In the example below there are three projects: + +1. “main”, +2. “project\_1”, +3. “project\_2”. + +![projects.png](../_images/projects.png) + +… and three users: + +All clouds + +1. “owner” - the user with **member** role in project “main”, +2. “user\_1” - the user with **member** role in project “project\_1”, +3. “user\_2” - the user with **member** role in project “project\_2”. + +![users.png](../_images/users.png) + +The user “owner” has three containers in their project “main”… + +1. c-main-a, +2. c-main-b, +3. c-main-d. + +![owner_con.png](../_images/owner_con.png) + +…and the following files in the containers: + +* c-main-a + + + test-main-a1.txt + + test-main-a2.txt +* c-main-b + + + test-main-b.txt +* c-main-d + + + test-main-d.txt + +In the example below, the user “owner” will grant “read only” access to container “c-main-a” for “user\_1” + +Download the RC file to share permissions with users[](#download-the-rc-file-to-share-permissions-with-users "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------- + +Firstly, the user “owner” should login to their domain if they didn’t do it yet: + +![owner_login.png](../_images/owner_login.png) + +Then, they should choose the main project: + +![owner_main.png](../_images/owner_main.png) + +After that, they should download the “OpenStack RC File” for the user “owner” and the project “main”: + +![owner_rc.png](../_images/owner_rc.png) + +Note + +We shall assume the simplest case in which all three users have access to the cloud with one-factor authentication. If two-factor authentication is enabled, then the owner will have to share the six-digit code that is needed for the second factor of authentication. + +You can preview the content of that file in your Linux terminal: + +``` +$ cat main-openrc.sh + +``` + +**main-openrc.sh** + +``` +#!/usr/bin/env bash +# To use an OpenStack cloud you need to authenticate against the Identity +# service named keystone, which returns a **Token** and **Service Catalog**. +# The catalog contains the endpoints for all services the user/tenant has +# access to - such as Compute, Image Service, Identity, Object Storage, Block +# Storage, and Networking (code-named nova, glance, keystone, swift, +# cinder, and neutron). +# +# *NOTE*: Using the 3 *Identity API* does not necessarily mean any other +# OpenStack API is version 3. For example, your cloud provider may implement +# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is +# only for the Identity API served through keystone. +unset OS_TENANT_ID +unset OS_TENANT_NAME +export OS_AUTH_URL=https://keystone.cloudferro.com:5000/v3 +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 +export OS_USERNAME="owner" +export OS_REGION_NAME="WAW3-1" +export OS_PROJECT_ID=ab0c8e1710854b92b0be2b40b31a615a +export OS_PROJECT_NAME="main_project" +export OS_PROJECT_DOMAIN_ID="119f4676f307434eaf28daab5ba3cc92" +if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi +if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi +if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi +echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " +read -sr OS_PASSWORD_INPUT +export OS_PASSWORD=$OS_PASSWORD_INPUT +export OS_AUTH_TYPE=password +export OS_USER_DOMAIN_NAME="cloud_00373" # ****IF THIS LINE IS MISSING IN YOUR FILE PLEASE ADD IT!!!**** + +``` + +Sharing the RC file with the users[](#sharing-the-rc-file-with-the-users "Permalink to this headline") +------------------------------------------------------------------------------------------------------- + +Copy the file **main-openrc.sh** to your CLI directory. + +The user called “user\_1” should do the same procedure: + +1. login to their “project\_1” +2. download the “OpenStack RC File” for user “user\_1” and project “project\_1” + +project\_1-openrc.sh + +``` +#!/usr/bin/env bash +# To use an OpenStack cloud you need to authenticate against the Identity +# service named keystone, which returns a **Token** and **Service Catalog**. +# The catalog contains the endpoints for all services the user/tenant has +# access to - such as Compute, Image Service, Identity, Object Storage, Block +# Storage, and Networking (code-named nova, glance, keystone, swift, +# cinder, and neutron). +# +# *NOTE*: Using the 3 *Identity API* does not necessarily mean any other +# OpenStack API is version 3. For example, your cloud provider may implement +# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is +# only for the Identity API served through keystone. +unset OS_TENANT_ID +unset OS_TENANT_NAME +export OS_AUTH_URL=https://keystone.cloudferro.com:5000/v3 +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 +export OS_USERNAME="user_1" +export OS_REGION_NAME="WAW3-1" +export OS_PROJECT_ID=4d488c376c0b4bc79a60b56bc72834e8 +export OS_PROJECT_NAME="p_project_1" +export OS_PROJECT_DOMAIN_ID="119f4676f307434eaf28daab5ba3cc92" +if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi +if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi +if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi +echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " +read -sr OS_PASSWORD_INPUT +export OS_PASSWORD=$OS_PASSWORD_INPUT +export OS_AUTH_TYPE=password +export OS_USER_DOMAIN_NAME="cloud_00373" # ****IF THIS LINE IS MISSING IN YOUR FILE PLEASE ADD IT!!!**** + +``` + +The called “user\_2” should do the same procedure as above. + +Owner sources the RC file[](#owner-sources-the-rc-file "Permalink to this headline") +------------------------------------------------------------------------------------- + +Now, each user should open their terminal and source the openrc file: + +terminal of user “owner” + +``` +$ source main-openrc.sh +Please enter your OpenStack Password for project main as user owner: + +(owner) $ swift list +c-main-a +c-main-b +c-main-d + +``` + +User\_1 sources the RC file[](#user-1-sources-the-rc-file "Permalink to this headline") +---------------------------------------------------------------------------------------- + +terminal of user “user\_1”: + +``` +$ source project_1-openrc.sh +Please enter your OpenStack Password for project project_1 as user user_1: + + +(user_1) $ swift list +c-project_1-a +c-project_1-b + +``` + +User\_2 sources the RC file[](#user-2-sources-the-rc-file "Permalink to this headline") +---------------------------------------------------------------------------------------- + +terminal of user “user\_2”: + +``` +$ source project_2-openrc.sh +Please enter your OpenStack Password for project project_2 as user user_2: + +(user_2) $ swift list +c-project_2-a +c-project_2-b + +``` + +Uploading of test files[](#uploading-of-test-files "Permalink to this headline") +--------------------------------------------------------------------------------- + +The user “owner” prepares and uploads test files: + +``` +(owner) $ touch test-main-a1.txt +(owner) $ touch test-main-a2.txt +(owner) $ swift upload c-main-a test-main-a1.txt +test-main-a1.txt +(owner) $ swift upload c-main-a test-main-a2.txt +test-main-a2.txt + +``` + +![owner_upload_0.png](../_images/owner_upload_0.png) + +``` +(owner) $ touch test-main-b.txt +(owner) $ touch test-main-d.txt +(owner) $ swift upload c-main-b test-main-b.txt +test-main-b.txt + +``` + +![owner_upload_1.png](../_images/owner_upload_1.png) + +``` +(owner) $ swift upload c-main-d test-main-d.txt +test-main-d.txt + +``` + +![owner_upload_1.png](../_images/owner_upload_1.png) + +Check the id of user\_1: + +``` +(user_1) $ openstack user show --format json "${OS_USERNAME}" | jq -r .id +3de5f40b4e6d433792ac387896729ec8 + +``` + +Check the id of user\_2: + +``` +(user_2) $ openstack user show --format json "${OS_USERNAME}" | jq -r .id +fb4ec0de674d4c5ba608ee75cc6da918 + +``` + +You can check the status of the container “c-main-a”. + +“Read ACL” and “Write ACL” are not set yet + +``` +(owner) $ swift stat c-main-a + Account: v1 + Container: c-main-a + Objects: 2 + Bytes: 29 + Read ACL: *:3de5f40b4e6d433792ac387896729ec8 + Write ACL: *:3de5f40b4e6d433792ac387896729ec8 + Sync To: + Sync Key: + X-Timestamp: 1655199342.39064 +X-Container-Bytes-Used-Actual: 8192 + X-Storage-Policy: default-placement + X-Storage-Class: STANDARD + Last-Modified: Tue, 14 Jun 2022 13:41:32 GMT + X-Trans-Id: tx000000000000003964e44-0062b17ebb-17404e6b-default + X-Openstack-Request-Id: tx000000000000003964e44-0062b17ebb-17404e6b-default + Accept-Ranges: bytes + Content-Type: text/plain; charset=utf-8 + +``` + +Granting access[](#granting-access "Permalink to this headline") +----------------------------------------------------------------- + +Grant access to container “c-main-a” for user\_1: + +``` +(owner) $ swift post --read-acl "*:3de5f40b4e6d433792ac387896729ec8 " c-main-a + +``` + +Get the credentials to access Object Store in “main”: + +``` +(owner) $ swift auth | awk -F = '/OS_STORAGE_URL/ {print $2}' +https://s3.waw3-1.cloudferro.com/swift/v1 + +``` + +Pass the link: + +``` +https://s3.waw3-1.cloudferro.com/swift/v1 + +``` + +to “user\_1” + +“user\_1” should create an environmental variable “SURL” + +``` +(user_1) $ SURL=https://s3.waw3-1.cloudferro.com/swift/v1 + +``` + +Now the “user\_1” has access to the “c-main-a” container in the “main” project: + +``` +(user_1) $ swift --os-storage-url="${SURL}" list c-main-a +test-main-a1.txt +test-main-a2.txt + +``` + +But the user “user\_1” has no access to other containers in the “main” project: + +``` +(user_1) $ swift --os-storage-url="${SURL}" list c-main-b +Container GET failed: https://s3.waw3-1.cloudferro.com/swift/v1/c-main-b?format=json 403 Forbidden [first 60 +chars of response] b'{"Code":"AccessDenied","BucketName":"c-main-b","RequestId":"' +Failed Transaction ID: tx00000000000000397edda-0062b186ef-17379d9b-default + +``` + +Similar procedure can be used to grant “write” permission to “user\_1”: + +``` +(owner) $ swift post --write-acl "*:3de5f40b4e6d433792ac387896729ec8 " c-main-a + +``` + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +These articles can also be of interest: + +[How to use Object Storage on CloudFerro Cloud](../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html). + +[Bucket sharing using s3 bucket policy on CloudFerro Cloud](../s3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..c47716c --- /dev/null +++ b/docs/openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,15 @@ +How to start a VM from instance snapshot using OpenStack CLI on CloudFerro Cloud[](#how-to-start-a-vm-from-instance-snapshot-using-openstack-cli-on-brand-name "Permalink to this headline") +============================================================================================================================================================================================= + +In this article, you will learn how to create a virtual machine from an instance snapshot using OpenStack CLI client. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **OpenStack CLI client** + +You need to have OpenStack CLI client installed. One of the following articles should help you: \ No newline at end of file diff --git a/docs/openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html.md b/docs/openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e81a3e7 --- /dev/null +++ b/docs/openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html.md @@ -0,0 +1,28 @@ +How to transfer volumes between domains and projects using OpenStack CLI client on CloudFerro Cloud[](#how-to-transfer-volumes-between-domains-and-projects-using-openstack-cli-client-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================================================== + +Volumes in OpenStack can be used to store data. They are visible to virtual machines like drives. + +Such a volume is usually available to just the project in which it was created. Transferring data stored on it between projects might take a long time, especially if such a volume contains lots of data, like, say, hundreds or thousands of gigabytes (or even more). + +This article covers changing the assignment of a volume to a project. This allows you to move a volume directly from one project (which we will call *source* project) to another (which we will call *destination* project) using the OpenStack CLI in a way that does **not** require you to physically transfer the data. + +The *source* project and *destination* project must both be on the same cloud (for example WAW3-2). They can (but don’t have to) belong to different users from different domains and organizations. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Initializing transfer of volume +> * Accepting transfer of volume +> * Cancelling transfer of volume + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: + +No. 2 **OpenStack CLI Client** + +To use the OpenStack CLI client, you need to have it installed. See one of these articles to learn how to do it: \ No newline at end of file diff --git a/docs/openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md b/docs/openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..a6b3ea1 --- /dev/null +++ b/docs/openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html.md @@ -0,0 +1,142 @@ +Resizing a virtual machine using OpenStack CLI on CloudFerro Cloud[](#resizing-a-virtual-machine-using-openstack-cli-on-brand-name "Permalink to this headline") +================================================================================================================================================================= + +Introduction[](#introduction "Permalink to this headline") +----------------------------------------------------------- + +When creating a new virtual machine under OpenStack, one of the options you choose is the *flavor*. A flavor is a predefined combination of CPU, memory and disk size and there usually is a number of such flavors for you to choose from. + +After the instance is spawned, it is possible to change one flavor for another, and that process is called *resizing*. You might want to resize an already existing VM in order to: + +> * increase (or decrease) the number of CPUs used, +> * use more RAM to prevent crashes or enable swapping, +> * add larger storage to avoid running out of disk space, +> * seamlessly transition from testing to production environment, +> * change application workload byt scaling the VM up or down. + +In this article, we are going to resize VMs using CLI commands in OpenStack. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +If you are a normal user of CloudFerro Cloud hosting, you will have all prerogatives needed to resize the VM. Make sure that the VM you are about to resize belongs to a project you have access to. + +[How to create a VM using the OpenStack CLI client on CloudFerro Cloud cloud](../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html) + +No. 2 **Awareness of existing quotas and flavors limits** + +For general introduction to quotas and flavors, see [Dashboard Overview – Project Quotas And Flavors Limits on CloudFerro Cloud](../cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html). + +Also: + +> * The VM you want to resize is in an active or shut down state. +> * A flavor with the desired resource configuration exists. +> * Adequate resources are available in your OpenStack environment to accommodate the resize. + +Creating a new VM[](#creating-a-new-vm "Permalink to this headline") +--------------------------------------------------------------------- + +To illustrate the commands in this article, let us create a new VM in order to start with a clean slate. (It goes without saying that you can practice with any of the already existing VMs in your account.) + +To see all flavors: + +``` +openstack flavor list + +``` + +![resize-vm-horizon-cli-3.png](../_images/resize-vm-horizon-cli-3.png) + +This is the command to create a new VM called **ResizingCLI**: + +``` +openstack server create \ +--image "Ubuntu 22.04 LTS" \ +--flavor eo2a.large \ +--key-name sshkey \ +--network cloud_00341_3 \ +--security-group default \ +--security-group allow_ping_ssh_icmp_rdp \ +ResizingCLI + +``` + +This is the result: + +![resize-vm-horizon-cli-2.png](../_images/resize-vm-horizon-cli-2.png) + +The **id** for **ResizingCLI** is **82bba971-8ff1-4f85-93d6-9d56bb7b185d** and we can use it in various commands to denote this particular VM. + +To see all currently available VMs, use command + +``` +openstack server list + +``` + +Steps to Resize the VM[](#steps-to-resize-the-vm "Permalink to this headline") +------------------------------------------------------------------------------- + +To resize a VM with CLI, there is a general command + +``` +openstack server resize --flavor + +``` + +We need flavor ID or name as well as VM’s name or id. + +In this example we want to scale up the existing VM **ResizingCLI**, using **eo2.xlarge** flavor. The command will be: + +``` +openstack server resize --flavor eo2.xlarge ResizingCLI + +``` + +To verify the resize, check the status of the VM: + +``` +openstack server show ResizingCLI + +``` + +![resize-vm-horizon-cli-4.png](../_images/resize-vm-horizon-cli-4.png) + +When the VM has **VERIFY\_RESIZE** status, we are able to confirm the resize. The command is: + +``` +openstack server resize confirm ResizingCLI + +``` + +Execute once again: + +``` +openstack server show ResizingCLI + +``` + +to see the real state of the VM after confirmation. We will now see that the **status** is **ACTIVE**. + +Reverting a resize[](#reverting-a-resize "Permalink to this headline") +----------------------------------------------------------------------- + +Reverting a resize switches the VM back to its original flavor and cleans up temporary resources allocated during the resize operation. + +It is only possible to revert a resize if the status is **VERIFY\_RESIZE**. The command would be: + +``` +openstack server resize revert ResizingCLI + +``` + +If status is not **VERIFY\_RESIZE**, we will get message stating that it is not possible to revert resize while it is in an active state (HTTP 409). In that case, perform the “regular” resizing with **openstack server resize**. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can also resize the virtual machine using only OpenStack CLI. More details here: /openstackcli/Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud \ No newline at end of file diff --git a/docs/openstackcli/Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html.md b/docs/openstackcli/Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..f0fed7e --- /dev/null +++ b/docs/openstackcli/Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html.md @@ -0,0 +1,54 @@ +Use backup command to create rotating backups of virtual machines on CloudFerro Cloud cloud[](#use-backup-command-to-create-rotating-backups-of-virtual-machines-on-brand-name-cloud "Permalink to this headline") +=================================================================================================================================================================================================================== + +**Rotating backups** in OpenStack refer to a backup strategy where older backups are automatically deleted after a predefined number of backups are created. This ensures that storage does not grow indefinitely while still maintaining a set number of recent backups for disaster recovery. + +The rotating backup algorithm[](#the-rotating-backup-algorithm "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Creating rotating backups of virtual machines is a process comprising of the following steps: + +Define the period of backups +: Usually, daily, weekly, monthly or in any other time period. + +Define rotation limit +: How many backups to retain (we will refer to this number as **maxN** throughout this article). + +Delete older backups +: Once the limit is reached, start deleting the existing backups, usually the oldest one. + +backup create vs. image create[](#backup-create-vs-image-create "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +There are two ways of creating backups under OpenStack, using one of these two commands: + +**openstack server backup create** and **openstack server image create** + +Here is how they compare: + +Table 3 Comparison of Backup and Image Creation Commands[](#id1 "Permalink to this table") + +| Feature | `openstack server backup create` | `openstack server image create` | +| --- | --- | --- | +| Association with VM | Associated using **backup** image property | Associated using backup name | +| Rotation support | Rotation with `--backup-type` and incremental backups | No built-in rotation support | +| Classification in Horizon | Marked as **image** | Marked as **snapshot** | +| Horizon **Select Boot Source** | Choose **Instance Snapshot** | Choose **Image** | +| Purpose | Primarily used for backups, can be rotated and managed | Creates a single VM snapshot without rotation | +| Incremental backup support | Yes, supports incremental backups | No, always creates a full snapshot | +| Multiple rotating schedules | No, only one | Yes (daily, weekly, monthly etc.) | +| Best usage scenario | Automated backup strategies with rotation | Capturing the current state of a VM for cloning or rollback | +| Can be scripted? | Yes | Yes | + +In this article we are going to use a **openstack server backup create** command under OpenStack to create rotating backups of virtual machines. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: + +No. 2 **VM which will be backed up** + +You need a virtual machine which will be backed up. If you don’t have one, you can create it by following one of these articles: \ No newline at end of file diff --git a/docs/openstackcli/Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html.md b/docs/openstackcli/Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..5c935a2 --- /dev/null +++ b/docs/openstackcli/Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html.md @@ -0,0 +1,40 @@ +Use script to create daily weekly and monthly rotating backups of virtual machines on CloudFerro Cloud[](#use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-on-brand-name "Permalink to this headline") +========================================================================================================================================================================================================================================= + +**Rotating backups** in OpenStack refer to a backup strategy where older backups are automatically deleted after a predefined number of backups are created. This ensures that storage does not grow indefinitely while still maintaining a set number of recent backups for disaster recovery. + +backup create vs. image create[](#backup-create-vs-image-create "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +There are two ways of creating backups under OpenStack, using one of these two commands: + +**openstack server backup create** and **openstack server image create** + +Here is how they compare: + +Table 4 Comparison of Backup and Image Creation Commands[](#id1 "Permalink to this table") + +| Feature | `openstack server backup create` | `openstack server image create` | +| --- | --- | --- | +| Association with VM | Associated using **backup** image property | Associated using backup name | +| Rotation support | Rotation with `--backup-type` and incremental backups | No built-in rotation support | +| Classification in Horizon | Marked as **image** | Marked as **snapshot** | +| Horizon **Select Boot Source** | Choose **Instance Snapshot** | Choose **Image** | +| Purpose | Primarily used for backups, can be rotated and managed | Creates a single VM snapshot without rotation | +| Multiple rotating schedules | No, only one | Yes (daily, weekly, monthly etc.) | +| Incremental backup support | Yes, supports incremental backups | No, always creates a full snapshot | +| Best usage scenario | Automated backup strategies with rotation | Capturing the current state of a VM for cloning or rollback | +| Can be scripted? | Yes | Yes | + +In this article, you will learn how to create multiple series of rotating backups with a script which uses multiple **OpenStackClient** commands to achieve this goal. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: + +No. 2 **VM which will be backed up** + +You need a virtual machine which will be backed up. If you don’t have one, you can create it by following one of these articles: \ No newline at end of file diff --git a/docs/openstackcli/openstackcli.html.md b/docs/openstackcli/openstackcli.html.md new file mode 100644 index 0000000..6973039 --- /dev/null +++ b/docs/openstackcli/openstackcli.html.md @@ -0,0 +1,2 @@ +OPENSTACK CLI[](#openstack-cli "Permalink to this headline") +============================================================= \ No newline at end of file diff --git a/docs/openstackdev/Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html.md b/docs/openstackdev/Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b346b1e --- /dev/null +++ b/docs/openstackdev/Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html.md @@ -0,0 +1,98 @@ +Authenticating with OpenstackSDK using Keycloak Credentials on CloudFerro Cloud[](#authenticating-with-openstacksdk-using-keycloak-credentials-on-brand-name "Permalink to this headline") +=========================================================================================================================================================================================== + +If you are using OpenStackSDK to write your own script for OpenStack, the code in this tutorial will **enable the user to automatically log into your app**. When the user normally tries to log into the CloudFerro Cloud account using , they have to log in manually. A screen like this appears: + +[![register_cloudferrocloud1.png](../_images/register_cloudferrocloud1.png)](../_images/register_cloudferrocloud1.png) + +If they already have an account, they will be logged in after clicking on Login button. The code in this article will avoid exposing the user to such a procedure and if they had ever been authenticated to OpenStack, **the user will be able to log in with your code without even seeing the login screen**. + +What Are We Going To Do[](#what-are-we-going-to-do "Permalink to this headline") +--------------------------------------------------------------------------------- + +> * Set up Python, pip and Venv environments, +> * Download RC file from Horizon, +> * Source that file (execute it and supply the password to authenticate yourself to the system), +> * Prepare Python code to authenticate to Keycloak by using the values from RC file. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +**No. 1 Install Python and its environment** + +The following article will help you install Python and **pip**, as well as **Venv**: [How to install Python virtualenv or virtualenvwrapper on CloudFerro Cloud](../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html). + +**No. 2 RC File** + +RC file is available from the OpenStack Horizon module and serves as a source of authentication for the user. For technical details how to get it and activate, see [How To Install OpenStack and Magnum Clients for Command Line Interface to CloudFerro Cloud Horizon](../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html). + +Step 1 Source Your RC File[](#step-1-source-your-rc-file "Permalink to this headline") +--------------------------------------------------------------------------------------- + +Using **Prerequisite No. 2**, download the corresponding RC file. That file can be executed using a **source** command in Linux/UNIX environments. Once executed, it will ask you for the password and will authenticate you with it. + +Here are the system variables (their names all start with **OS\_**) that the **source** command will set up as well: + +``` +export OS_AUTH_URL=https://keystone.cloudferro.com:5000/v3 +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 +export OS_USERNAME="Your E-mail Adress" +export OS_REGION_NAME="WAW3-1" +export OS_PROJECT_ID="Your Project ID" +export OS_PROJECT_NAME="Your Project Name" +export OS_PROJECT_DOMAIN_ID="Your Domain ID" + +export OS_AUTH_TYPE=v3oidcpassword +export OS_PROTOCOL=openid +export OS_DISCOVERY_ENDPOINT=https://identity.cloudferro.com/auth/realms/Creodias-new/.well-known/openid-configuration +export OS_IDENTITY_PROVIDER=ident_creodias-new_provider +export OS_CLIENT_ID=openstack +export OS_CLIENT_SECRET=50xx4972-546x-46x9-8x72-x91x401x8x30 + +``` + +Step 2 Create Python Code that Will Perform Keycloak Authentication Within Your App[](#step-2-create-python-code-that-will-perform-keycloak-authentication-within-your-app "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +In this step you will copy the values from RC file to your Python code. For instance, variable + +``` +OS_DISCOVERY_ENDPOINT=https://identity.cloudferro.com/auth/realms/Creodias-new/.well-known/openid-configuration + +``` + +from RC file will become the value of the eponymous variable in your code: + +``` +auth['discovery_endpoint'] = "https://identity.cloudferro.com/auth/realms/Creodias-new/.well-known/openid-configuration" + +``` + +Here is what your code should look like in the end: + +``` +from openstack import connection +import sys +import os +from openstack import enable_logging + +auth = {} +auth['auth_url'] = "https://keystone.cloudferro.com:5000/v3" +auth['username'] = "Your E-mail Adress" +auth['password'] = os.getenv('OS_PASSWORD') +auth['project_domain_id'] = "Your Domain ID" +auth['project_name'] = "Your Project Name" +auth['project_id'] = "Your Project ID" +auth['discovery_endpoint'] = "https://identity.cloudferro.com/auth/realms/Creodias-new/.well-known/openid-configuration" +auth['client_id'] = "openstack" +auth['identity_provider'] = 'ident_creodias-new_provider' +auth['client_secret'] = os.getenv('OS_CLIENT_SECRET') +auth['protocol'] = 'openid' + +``` + +Step 3 Use the Code in Your App[](#step-3-use-the-code-in-your-app "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Once generated, this code will authenticate user and they will not have to supply their credentials each time they try to use your app. \ No newline at end of file diff --git a/docs/openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html.md b/docs/openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..9f8ed12 --- /dev/null +++ b/docs/openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html.md @@ -0,0 +1,345 @@ +Generating and authorizing Terraform using Keycloak user on CloudFerro Cloud[](#generating-and-authorizing-terraform-using-keycloak-user-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================== + +Clicking in Horizon and entering CLI commands are two main ways of using an OpenStack system. They are well suited to interactively executing one command at a time but do not scale up easily. A tool such as [Terraform, by HashiCorp corporation,](https://www.terraform.io/) provides an alternative to manual ways of introducing cascading changes. Here is how you could, say, create several instances at once: + +> * Define parameters for the creation of one instance, +> * save them in a Terraform configuration file and +> * let Terraform automatically repeat it the prescribed number of times. + +The plan is to install Terraform, get OpenStack token, enter it into the configuration file and execute. You will then be able to effectively use Terraform within the CloudFerro Cloud cloud. For instance, with Terraform you can + +> * automate creation of a multitude of virtual machines, each with their own floating IPs, DNS and network functions or +> * automate creation of Kubernetes clusters + +and so on. + +What We Are Going To Do[](#what-we-are-going-to-do "Permalink to this headline") +--------------------------------------------------------------------------------- + +> * Install Terraform as a root user +> * Reconnect to the cloud +> * Download OpenStack token +> * Set up the configuration file and initialize Terraform +> * Create Terraform code +> * Explain the meaning of the variables used +> * Execute the Terraform script + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . In particular, you will need the password for the account so have it ready in advance. + +No. 2 **Installed version of Linux** + +You can use your current Linux installation, however, in this article we shall start with a clean slate. Create a new VM with Ubuntu as defined in this article: + +[How to create a Linux VM and access it from Linux command line on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html). + +No. 3 **Installed OpenStackClient for Linux** + +To get token from the cloud, you will first need to enable access from the Ubuntu VM you just created: + +[How to install OpenStackClient for Linux on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html) + +It will show you how to install Python, create and activate a virtual environment, and then connect to the cloud by downloading and activating the proper RC file from the CloudFerro Cloud cloud. + +No. 4 **Connect to the cloud via an RC file** + +Another article, [How to activate OpenStack CLI access to CloudFerro Cloud cloud using one- or two-factor authentication](../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html), deals with connecting to the cloud and is covering either of the one- or two-factor authentication procedures that are enabled on your account. It also covers all the main platforms: Linux, MacOS and Windows. + +You will use both the Python virtual environment and the downloaded RC file **after** Terraform has been installed. + +Step 1 Install Terraform as a root user[](#step-1-install-terraform-as-a-root-user "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +Install the required dependencies using the following command: + +``` +sudo apt-get install wget curl unzip software-properties-common gnupg2 -y + +``` + +Download and add the HashiCorp signed *gpg* keys to your system. To perform this action, first enter *root* mode: + +``` +sudo su # Enter root mode +curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add - + +``` + +Add the HashiCorp repository to the APT: + +``` +sudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com $(lsb_release -cs) main" + +``` + +![terraform_adding_repository.png](../_images/terraform_adding_repository.png) + +The following commands will update Ubuntu, install Terraform and check its version: + +``` +apt-get update -y #update Ubuntu +apt-get install terraform -y # install Terraform +terraform -v # check the version + +``` + +Now exit *root* mode and become the standard **eouser** again. + +``` +su eouser # Exit root mode + +``` + +Step 2 Reconnect to the cloud[](#step-2-reconnect-to-the-cloud "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +Working through Prerequisites Nos. 2 and 3, you ended up being connected up to the cloud. That connection is now lost because you have switched to **root** user and back again, to the normal **eouser** for the CloudFerro Cloud cloud. Refer to **Prerequisite No. 4 Activate the RC file** to reconnect to the cloud again. The following command will act as a test: + +``` +openstack flavor list + +``` + +and should present a start of a list of flavors available in the system: + +![terraform_flavor_list_short.png](../_images/terraform_flavor_list_short.png) + +**You are now ready to receive token from the cloud you are working with.** The “token” is actually a very long string of characters which serves as kind of password for your code. + +Step 3 Download OpenStack token[](#step-3-download-openstack-token "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Get token with the following command: + +``` +openstack token issue -f shell -c id + +``` + +This is the result: + +``` +id="gAAAAABj1VTWP_CFhfKv4zWVH7avFUnHYf5J4TvuKG_Md1EdSpBIBZqTVErqVNWCnO-kYq9D7fi33aRCABadsp23-e-lrDFwyZGkfv-d83UkOTsoIuWogupmwx-3gr4wPcsikBvkAMMBD0-XMIkUONAPst6C35QnztSzZmVSeuXOJ33DaGr6yWbY-tNAOpNsk0C9c13U6ROI" + +``` + +Value of variable **id** is the token you need. Copy and save it so that you can enter it into the configuration file for Terraform. + +Step 4 Set up the configuration file and initialize Terraform[](#step-4-set-up-the-configuration-file-and-initialize-terraform "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Create new directory where your Terraform files will be stored and switch to it: + +``` +mkdir terraform-dir # Name it as you want +cd terraform-dir + +``` + +Create configuration file, **yourconffile.tf**, and open it in text editor. Here we use **nano**: + +``` +sudo nano yourconffile.tf # Name it as you want + +``` + +Paste the following into the file: + +``` +# Configure the OpenStack Provider + terraform { + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + } + } + } + +``` + +Save the file (for Nano, use **Ctrl-X** and **Y**). + +These commands inform Terraform it will work with OpenStack. + +Use the following command to initialize Terraform: + +``` +terraform init + +``` + +Terraform will read **yourconffile.tf** file from the current folder. The actual name does not matter as long as it is the only **.tf** file in the folder. + +You can, of course, use many other **.tf** files such as + +> * *main.tf* for the main Terraform program, +> * *variable.tf* to define variables + +and so on. + +The screen after initialization would look like this: + +![terraform_init.png](../_images/terraform_init.png) + +Terraform has been initialized and is working properly with your OpenStack cloud. Now add code to perform some useful tasks. + +Note + +In examples that follow, we use two networks, one with name starting with **cloud\_** and the name of the other starting with **eodata\_**. The former network should always be present in the account, but the latter may or may not present. If you do not have network which name starts with **eodata\_**, you may create it or use any other network that you already have and want to use. + +Step 5 Create Terraform code[](#step-5-create-terraform-code "Permalink to this headline") +------------------------------------------------------------------------------------------- + +Append code to the contents of the **yourconffile.tf**. It will generate four virtual machines as specified in the value of variable **count**. The entire file **yourconffile.tf** should now look like this: + +``` +# Configure the OpenStack Provider +terraform { + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + } + } +} + +provider "openstack" { + user_name = "[email protected]" + tenant_name = "cloud_00aaa_1" + auth_url = "https://keystone.cloudferro.com:5000/v3" + domain_name = "cloud_00aaa_1" + token = "gAAAAABj1VTWP_CFhfKv4zWVH7avFUnHYf5J4TvuKG_Md1EdSpBIBZqTVErqVNWCnO-kYq9D7fi33aRCABadsp23-e-lrDFwyZGkfv-d83UkOTsoIuWogupmwx-3gr4wPcsikBvkAMMBD0-XMIkUONAPst6C35QnztSzZmVSeuXOJ33DaGr6yWbY-tNAOpNsk0C9c13U6ROI" + } + +resource "openstack_compute_instance_v2" "test-terra" { +count = 4 +name = "test-instance-${count.index}" +image_id = "d7ba6aa0-d5d8-41ed-b29b-3f5336d87340" +flavor_id = "eo2.medium" +security_groups = [ +"default", "allow_ping_ssh_icmp_rdp" ] +network { +name = "eodata_00aaa_3" +} +network { +name = "cloud_00aaa_3" +} +} + +``` + +Always use the latest value of image id[](#always-use-the-latest-value-of-image-id "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +From time to time, the default images of operating systems in the CloudFerro Cloud cloud are upgraded to the new versions. As a consequence, their **image id** will change. Let’s say that the image id for Ubuntu 20.04 LTS was **574fe1db-8099-4db4-a543-9e89526d20ae** at the time of writing of this article. While working through the article, you would normally take the **current** value of image id, and would use it to replace **574fe1db-8099-4db4-a543-9e89526d20ae** throughout the text. + +Now, suppose you wanted to automate processes under OpenStack, perhaps using Heat, Terraform, Ansible or any other tool for OpenStack automation; if you use the value of **574fe1db-8099-4db4-a543-9e89526d20ae** for image id, it would remain **hardcoded** and once this value gets changed during the upgrade, the automated process may stop to execute. + +Warning + +Make sure that your automation code is using the **current value** of an OS image id, not the hardcoded one. + +The meaning of the variables used[](#the-meaning-of-the-variables-used "Permalink to this headline") +----------------------------------------------------------------------------------------------------- + +The meaning of the variables used is as follows: + +**user\_name** +: User name with which you log in into the CloudFerro Cloud account. You can use email address here as well. + +**tenant\_name** +: Starts with **cloud\_00**. You can see it in the upper left corner of the Horizon window. + +**domain\_name** +: If you have only one project in the domain, this will be identical to the **tenant\_name** from above. + +**token** +: The **id** value you got from command **openstack token issue**. + +**count** +: How many times to repeat the operation (in this case, four new virtual machines to create) + +**name** +: The name of each VM; here it is differentiated by adding an ordinal number at the end of the name, for example, *test-instance-1*, *test-instance-0*, *test-instance-2*, *test-instance-3*. + +**image\_id** +: The name or **ID** code for an operating systems image you get with command **Compute** -> **Images**. For example, if you choose *Ubuntu 20.04 LTS* image, its **ID** is *d7ba6aa0-d5d8-41ed-b29b-3f5336d87340*. + +**flavor\_id** +: Name of the flavor that each VM will have. You get these names from command **openstack flavor list**. + +**security\_groups** +: Here, it is an array of two security groups – **default** and **allow\_ping\_ssh\_icmp\_rdp**. These are the basic security groups that should be used as a start for all VMs. + +**network** +: Name of the network to use. In this case, we include network **eodata\_00aaa\_3** for eodata and **cloud\_00aaa\_3** for general communication within the cloud. + +Step 6 Execute the Terraform script[](#step-6-execute-the-terraform-script "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +Here is how Terraform will create four instances of Ubuntu 20.04 LTS. Command **apply** will execute the script; when asked for confirmation to proceed, type **yes** to start the operation: + +``` +terraform apply + +``` + +![terraform_yes.png](../_images/terraform_yes.png) + +Type + +``` +yes + +``` + +It will create four VMs as defined by variable **count**. + +You should see output similar to this: + +![terraform_apply.png](../_images/terraform_apply.png) + +This is how you would see those virtual machines in Horizon: + +![terraform_horizon.png](../_images/terraform_horizon.png) + +If you wanted to revert the actions, that is, delete the VMs you have just created, the command would be: + +``` +terraform destroy + +``` + +Again, type **yes** to start the operations. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Of particular interest would be the following CLI commands for Terraform: + +**plan** +: Shows what changes Terraform is going to apply for you to approve. + +**validate** +: Check whether the configuration is valid. + +**show** +: Show the current state or a saved plan. + +Use command + +``` +terraform -help + +``` + +to learn other commands Terraform can offer. + +What To Do Next[](#id1 "Permalink to this headline") +----------------------------------------------------- + +Article [How to create a set of VMs using OpenStack Heat Orchestration on CloudFerro Cloud](../openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html) uses orchestration capabilities of OpenStack to automate creation of virtual machines. It is a different approach compared to Terraform but both can lead to automation under OpenStack. \ No newline at end of file diff --git a/docs/openstackdev/openstackdev.html.md b/docs/openstackdev/openstackdev.html.md new file mode 100644 index 0000000..4ad93d9 --- /dev/null +++ b/docs/openstackdev/openstackdev.html.md @@ -0,0 +1,2 @@ +OPENSTACK DEV[](#openstack-dev "Permalink to this headline") +============================================================= \ No newline at end of file diff --git a/docs/releasenotes/releasenotes.html.md b/docs/releasenotes/releasenotes.html.md new file mode 100644 index 0000000..775efe9 --- /dev/null +++ b/docs/releasenotes/releasenotes.html.md @@ -0,0 +1,2 @@ +RELEASE NOTES[](#release-notes "Permalink to this headline") +============================================================= \ No newline at end of file diff --git a/docs/s3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html.md b/docs/s3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..ce01f72 --- /dev/null +++ b/docs/s3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html.md @@ -0,0 +1,292 @@ +Bucket sharing using s3 bucket policy on CloudFerro Cloud[](#bucket-sharing-using-s3-bucket-policy-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +S3 bucket policy[](#s3-bucket-policy "Permalink to this headline") +------------------------------------------------------------------- + +**Ceph** - the Software Defined Storage used in CloudFerro Cloud cloud, providing object storage compatibility with a subset of Amazon S3 API. Bucket policy in Ceph is part of the S3 API and allows for a selective access sharing to object storage buckets between users of different projects, in the same cloud. + +Naming conventions used in this document[](#naming-conventions-used-in-this-document "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +Bucket Owner +: OpenStack tenant who created an object storage bucket in their project, intending to share to their bucket or a subset of objects in the bucket to another tenant in the same cloud. + +Bucket User +: OpenStack tenant who wants to gain access to a Bucket Owner’s object storage bucket. + +Bucket Owner’s Project +: A project in which a shared bucket is created. + +Bucket User’s Project +: A project which gets access to Bucket Owner’s object storage bucket. + +Tenant Admin +: A tenant’s administrator user who can create OpenStack projects and manage users and roles within their domain. + +In code examples, values typed in all-capital letters, such as BUCKET\_OWNER\_PROJECT\_ID, are placeholders which should be replaced with actual values matching your use-case. + +Limitations[](#limitations "Permalink to this headline") +--------------------------------------------------------- + +It is possible to grant access at the project level only, not at the user level. In order to grant access to an individual user, +Bucket User’s Tenant Admin must create a separate project within their domain, which only selected users will be granted access to. + +Ceph S3 implementation + +> * supports the following S3 actions by setting bucket policy but +> * does not support user, role or group policies. + +S3cmd CONFIGURATION[](#s3cmd-configuration "Permalink to this headline") +------------------------------------------------------------------------- + +To share bucket using S3 bucket policy you have to configure s3cmd first using this tutorial [How to access private object storage using S3cmd or boto3 on CloudFerro Cloud](How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html) + +Declaring bucket policy[](#declaring-bucket-policy "Permalink to this headline") +--------------------------------------------------------------------------------- + +Important + +The code in this article will work only if the value of **Version** parameter is + +``` +"Version": "2012-10-17", + +``` + +### Policy JSON file’s sections[](#policy-json-file-s-sections "Permalink to this headline") + +Bucket policy is declared using a JSON file. It can be created using editors such as **vim** or **nano**. Here is an example policy JSON template: + +``` +{ + "Id": "POLICY_ID", + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "STATEMENT_NAME", + "Action": [ + "s3:ACTION_1", + "s3:ACTION_2" + ], + "Effect": "EFFECT", + "Resource": "arn:aws:s3:::KEY_SPECIFICATION", + "Condition": { + "CONDITION_1": { + } + }, + "Principal": { + "AWS": [ + "arn:aws:iam::PROJECT_ID:root" + ] + } + } + ] + } + +``` + +POLICY\_ID +: ID of your policy. + +STATEMENT\_NAME +: Name of your statement. + +ACTION +: Actions that you grant access to bucket user to perform on the bucket. + +PROJECT\_ID +: Project ID + +### List of actions[](#list-of-actions "Permalink to this headline") + +``` +s3:AbortMultipartUpload +s3:CreateBucket +s3:DeleteBucketPolicy +s3:DeleteBucket +s3:DeleteBucketWebsite +s3:DeleteObject +s3:DeleteObjectVersion +s3:GetBucketAcl +s3:GetBucketCORS +s3:GetBucketLocation +s3:GetBucketPolicy +s3:GetBucketRequestPayment +s3:GetBucketVersioning +s3:GetBucketWebsite +s3:GetLifecycleConfiguration +s3:GetObjectAcl +s3:GetObject +s3:GetObjectTorrent +s3:GetObjectVersionAcl +s3:GetObjectVersion +s3:GetObjectVersionTorrent +s3:ListAllMyBuckets +s3:ListBucketMultiPartUploads +s3:ListBucket +s3:ListBucketVersions +s3:ListMultipartUploadParts +s3:PutBucketAcl +s3:PutBucketCORS +s3:PutBucketPolicy +s3:PutBucketRequestPayment +s3:PutBucketVersioning +s3:PutBucketWebsite +s3:PutLifecycleConfiguration +s3:PutObjectAcl +s3:PutObject +s3:PutObjectVersionAcl + +``` + +### KEY\_SPECIFICATION[](#key-specification "Permalink to this headline") + +It defines a bucket and its keys/objects. For example: + +``` +"arn:aws:s3:::*" - the bucket and all of its objects +"arn:aws:s3:::MY_SHARED_BUCKET/*" - all objects of mybucket +"arn:aws:s3:::MY_SHARED_BUCKET/myfolder/*" - all objects which are subkeys to myfolder in mybucket + +``` + +### Conditions[](#conditions "Permalink to this headline") + +Additional conditions to filter access to the bucket. For example you can grant access to the specific IP Address using: + +``` +"Condition": { + "IpAddress": { + "aws:SourceIp": "USER_IP_ADRESS/32" + } +} + +``` + +or, alternatively, you can permit access to the specific IP using: + +``` +"Condition": { + "NotIpAddress": { + "aws:SourceIp": "PERMITTED_USER_IP_ADRESS/32" + } + } + +``` + +SETTING A POLICY ON THE BUCKET[](#setting-a-policy-on-the-bucket "Permalink to this headline") +----------------------------------------------------------------------------------------------- + +The policy may be set on a bucket using: + +``` +s3cmd setpolicy POLICY_JSON_FILE s3://MY_SHARED_BUCKET command. + +``` + +To check policy on a bucket, use the following command: + +``` +s3cmd info s3://MY_SHARED_BUCKET + +``` + +The policy may be deleted from the bucket using: + +``` +s3cmd delpolicy s3://MY_SHARED_BUCKET + +``` + +Sample scenarios[](#sample-scenarios "Permalink to this headline") +------------------------------------------------------------------- + +### 1 Grant read/write access to a Bucket User using his **PROJECT\_ID**[](#grant-read-write-access-to-a-bucket-user-using-his-project-id "Permalink to this headline") + +A Bucket Owner wants to grant a bucket a read/write access to a Bucket User, using his **PROJECT\_ID**: + +``` +{ + "Version": "2012-10-17", + "Id": "read-write", + "Statement": [ + { + "Sid": "project-read-write", + "Effect": "Allow", + "Principal": { + "AWS": [ + "arn:aws:iam::BUCKET_OWNER_PROJECT_ID:root", + "arn:aws:iam::BUCKET_USER_PROJECT_ID:root" + ] + }, + "Action": [ + "s3:ListBucket", + "s3:PutObject", + "s3:DeleteObject", + "s3:GetObject" + ], + "Resource": [ + "arn:aws:s3:::*" + ] + } + ] +} + +``` + +Let’s assume that the file with this policy is named “read-write-policy.json”. To apply it, Bucket Owner should issue: + +``` +s3cmd setpolicy read-write-policy.json s3://MY_SHARED_BUCKET + +``` + +Then, to access the bucket, for example list the bucket, Bucket User should issue: + +``` +s3cmd ls s3://MY_SHARED_BUCKET + +``` + +### 2 – Limit read/write access to a Bucket to users accessing from specific IP address range[](#limit-read-write-access-to-a-bucket-to-users-accessing-from-specific-ip-address-range "Permalink to this headline") + +A Bucket Owner wants to grant read/write access to Bucket Users which access the bucket from specific IP ranges. + +(In this case, we are setting AWS to “\*” which will theoretically grant access to every Project in CloudFerro Cloud, then however we are going to filter access to only one IP) + +``` +{ + "Id": "Policy1654675551882", + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "Stmt1654675545682", + "Action": [ + "s3:GetObject", + "s3:PutObject" + ], + "Effect": "Allow", + "Resource": "arn:aws:s3:::MY_SHARED_BUCKET/*", + "Condition": { + "IpAddress": { + "aws:SourceIp": "IP_ADRESS/32" + } + }, + "Principal": { + "AWS": [ + "*" + ] + } + } + ] +} + +``` + +Let’s assume that the file with this policy is named “read-write-policy-ip.json”. To apply it, Bucket Owner should issue: + +``` +s3cmd setpolicy read-write-policy-ip.json s3://MY_SHARED_BUCKET + +``` \ No newline at end of file diff --git a/docs/s3/Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html.md b/docs/s3/Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..82a4704 --- /dev/null +++ b/docs/s3/Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html.md @@ -0,0 +1,14 @@ +Configuration files for s3cmd command on CloudFerro Cloud[](#configuration-files-for-s3cmd-command-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +[s3cmd](https://github.com/s3tools/s3cmd) can access remote data using the S3 protocol. This includes **EODATA** repository and object storage on the CloudFerro Cloud cloud. + +To connect to S3 storage, **s3cmd** uses several parameters, such as an access key, secret key, S3 endpoint, and others. During configuration, you can enter this data interactively, and the command saves it into a configuration file. This file can then be passed to **s3cmd** when issuing commands using the connection described within. + +If you want to use multiple connections from a single virtual machine (such as connecting both to the **EODATA** repository and to object storage on CloudFerro Cloud cloud), you can create and store multiple configuration files — one per connection. + +This article provides examples of how to create and save these configuration files under various circumstances and describes some potential problems you may encounter. + +The examples are **not** intended to be executed sequentially as part of a workflow; instead, they illustrate different use cases of **s3cmd** operations. + +What We Are Going To Cover \ No newline at end of file diff --git a/docs/s3/How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html.md b/docs/s3/How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..8f42fef --- /dev/null +++ b/docs/s3/How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html.md @@ -0,0 +1,52 @@ +How to Install Boto3 in Windows on CloudFerro Cloud[](#how-to-install-boto3-in-windows-on-brand-name "Permalink to this headline") +=================================================================================================================================== + +**boto3** library for Python serves for listing and downloading items from specified bucket or repository. In this article, you will install it in a Windows system. + +Step 1 Ensure That Python3 is Preinstalled[](#step-1-ensure-that-python3-is-preinstalled "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +**On a Desktop Windows System** + +To run **boto3**, you need to have Python preinstalled. If you are running Windows on a desktop computer, the first step of this article shows how to do it: [How to install OpenStackClient GitBash for Windows on CloudFerro Cloud](../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html). + +**On a Virtual Machine Running in CloudFerro Cloud Cloud** + +Virtual machines created in the CloudFerro Cloud cloud will have Python3 already preinstalled. If you want to spawn your own Windows VM, two steps will be involved: + +1. Log into your CloudFerro Cloud hosting account with access to the Horizon interface: . + +2. Use or create a new instance in the cloud. See article: [Connecting to a Windows VM via RDP through a Linux bastion host port forwarding on CloudFerro Cloud](../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html). + +Step 2 Install boto3 on Windows[](#step-2-install-boto3-on-windows "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +In order to install boto3 on Windows: + +> * Log in as administrator. +> * Click on the Windows icon in the bottom left of your Desktop. +> * Find Command prompt by entering **cmd** abbreviation. + +![boto1.png](../_images/boto1.png) + +Verify that you have up-to-date Python installed by entering “python -V”. + +![boto2.png](../_images/boto2.png) + +Then install boto3 with the following command: + +``` +pip install boto3 + +``` + +![boto3.png](../_images/boto3.png) + +Verify your installation, with command: + +``` +pip show boto3 + +``` + +![boto4.png](../_images/boto4.png) \ No newline at end of file diff --git a/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html.md b/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html.md new file mode 100644 index 0000000..de470dd --- /dev/null +++ b/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html.md @@ -0,0 +1,6 @@ +How to access object storage from CloudFerro Cloud using boto3[](#how-to-access-object-storage-from-brand-name-using-boto3 "Permalink to this headline") +========================================================================================================================================================= + +In this article, you will learn how to access object storage from CloudFerro Cloud using Python library **boto3**. + +What We Are Going To Cover \ No newline at end of file diff --git a/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html.md b/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html.md new file mode 100644 index 0000000..1d04526 --- /dev/null +++ b/docs/s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html.md @@ -0,0 +1,38 @@ +How to access object storage from CloudFerro Cloud using s3cmd[](#how-to-access-object-storage-from-brand-name-using-s3cmd "Permalink to this headline") +========================================================================================================================================================= + +In this article, you will learn how to access object storage from CloudFerro Cloud on Linux using [s3cmd](https://github.com/s3tools/s3cmd), without mounting it as a file system. This can be done on a virtual machine on CloudFerro Cloud cloud or on a local Linux computer. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Object storage vs. standard file system +> * Terminology: container and bucket +> * Configuring s3cmd +> * S3 paths in s3cmd +> * Listing containers +> * Creating a container +> * Uploading a file to a container +> * Listing files and directories of the root directory of a container +> * Listing files and directories not in the root directory of a container +> * Removing a file from a container +> * Downloading a file from a container +> * Checking how much storage is being used on a container +> * Removing the entire container + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Generated EC2 credentials** + +You need generate EC2 credentials. Learn more here: [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html) + +No. 3 **A Linux computer or virtual machine** + +You need a Linux virtual machine or local computer. This article was written for Ubuntu 22.04. Other operating systems might work, but are out of scope of this article and might require adjusting of commands. + +If you want to use a virtual machine hosted on CloudFerro Cloud cloud and you don’t have it yet, one of these articles can help: \ No newline at end of file diff --git a/docs/s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html.md b/docs/s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..090af9e --- /dev/null +++ b/docs/s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html.md @@ -0,0 +1,238 @@ +How to access private object storage using S3cmd or boto3 on CloudFerro Cloud[](#how-to-access-private-object-storage-using-s3cmd-or-boto3-on-brand-name "Permalink to this headline") +======================================================================================================================================================================================= + +LEGACY ARTICLE + +This article is marked as a legacy document and may not reflect the latest information. +Please refer to the following articles: + +[How to access object storage from CloudFerro Cloud using boto3](How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html) + +[How to access object storage from CloudFerro Cloud using s3cmd](How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html) + +**Introduction** + +Private object storage (buckets within user’s project) can be used in various ways. For example, to access files located in object storage, buckets can be mounted and used as a file system using **s3fs**. Other tools which can be used to achieve better performance are **S3cmd** (command line tool) and **boto3** (AWS SDK for Python). + +**S3cmd** + +In order to acquire access to Object Storage buckets via S3cmd, first you have to generate your own EC2 credentials with this tutorial [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html). + +Once EC2 credentials are generated, ensure that your instance or local machine is equipped with S3cmd: + +``` +s3cmd --version + +``` + +If not, S3cmd can be installed with: + +``` +apt install s3cmd + +``` + +Now S3cmd can be configured with the following command: + +``` +s3cmd --configure + +``` + +Input and confirm (by pressing Enter) the following values: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +New settings: +Access Key: (your EC2 credentials) +Secret Key: (your EC2 credentials) +Default Region: default +S3 Endpoint: s3.waw4-1.cloudferro.com +DNS-style bucket+hostname:port template for accessing a bucket: s3.waw4-1.cloudferro.com +Encryption password: (your password) +Path to GPG program: /usr/bin/gpg +Use HTTPS protocol: Yes +HTTP Proxy server name: +HTTP Proxy server port: 0 + +``` + +``` +New settings: +Access Key: (your EC2 credentials) +Secret Key: (your EC2 credentials) +Default Region: waw3-1 +S3 Endpoint: s3.waw3-1.cloudferro.com +DNS-style bucket+hostname:port template for accessing a bucket: s3.waw3-1.cloudferro.com +Encryption password: (your password) +Path to GPG program: /usr/bin/gpg +Use HTTPS protocol: Yes +HTTP Proxy server name: +HTTP Proxy server port: 0 + +``` + +``` +New settings: +Access Key: (your EC2 credentials) +Secret Key: (your EC2 credentials) +Default Region: default +S3 Endpoint: s3.waw3-2.cloudferro.com +DNS-style bucket+hostname:port template for accessing a bucket: s3.waw3-2.cloudferro.com +Encryption password: (your password) +Path to GPG program: /usr/bin/gpg +Use HTTPS protocol: Yes +HTTP Proxy server name: +HTTP Proxy server port: 0 + +``` + +``` +New settings: +Access Key: (your EC2 credentials) +Secret Key: (your EC2 credentials) +Default Region: default +S3 Endpoint: s3.fra1-2.cloudferro.com +DNS-style bucket+hostname:port template for accessing a bucket: s3.fra1-2.cloudferro.co +Encryption password: (your password) +Path to GPG program: /usr/bin/gpg +Use HTTPS protocol: Yes +HTTP Proxy server name: +HTTP Proxy server port: 0 + +``` + +After this operation, you should be allowed to list and access your Object Storage. + +List your buckets with: + +``` +eouser@vm01:$ s3cmd ls +2022-02-02 22:22 s3://bucket + +``` + +To see available commands for S3cmd, type the following command: + +``` +s3cmd -h + +``` + +**boto3** + +Warning + +We strongly recommend using virtualenv for isolating python packages. Configuration tutorial is this: [How to install Python virtualenv or virtualenvwrapper on CloudFerro Cloud](../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html) + +If virtualenv is activated: + +``` +(myvenv) eouser@vm01:~$ pip3 install boto3 + +``` + +Or if we install the package globally: + +``` +eouser@vm01:~$ sudo pip3 install boto3 + +``` + +**Simple script for accessing your private bucket:** + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +import boto3 + +def boto3connection(access_key,secret_key,bucketname): +host='https://s3.waw4-1.cloudferro.com' +s3=boto3.resource('s3',aws_access_key_id=access_key, +aws_secret_access_key=secret_key, endpoint_url=host,) + +bucket=s3.Bucket(bucketname) +for obj in bucket.objects.filter(): + print('{0}:{1}'.format(bucket.name, obj.key)) + +#For Python3 +x = input('Enter your access key:') +y = input('Enter your secret key:') +z = input('Enter your bucket name:') + +boto3connection(x,y,z) + +``` + +``` +import boto3 + +def boto3connection(access_key,secret_key,bucketname): +host='https://s3.waw3-1.cloudferro.com' +s3=boto3.resource('s3',aws_access_key_id=access_key, +aws_secret_access_key=secret_key, endpoint_url=host,) + +bucket=s3.Bucket(bucketname) +for obj in bucket.objects.filter(): + print('{0}:{1}'.format(bucket.name, obj.key)) + +#For Python3 +x = input('Enter your access key:') +y = input('Enter your secret key:') +z = input('Enter your bucket name:') + +boto3connection(x,y,z) + +``` + +``` +import boto3 + +def boto3connection(access_key,secret_key,bucketname): +host='https://s3.waw3-2.cloudferro.com' +s3=boto3.resource('s3',aws_access_key_id=access_key, +aws_secret_access_key=secret_key, endpoint_url=host,) + +bucket=s3.Bucket(bucketname) +for obj in bucket.objects.filter(): + print('{0}:{1}'.format(bucket.name, obj.key)) + +#For Python3 +x = input('Enter your access key:') +y = input('Enter your secret key:') +z = input('Enter your bucket name:') + +boto3connection(x,y,z) + +``` + +``` +import boto3 + +def boto3connection(access_key,secret_key,bucketname): +host='https://s3.fra1-2.cloudferro.com' +s3=boto3.resource('s3',aws_access_key_id=access_key, +aws_secret_access_key=secret_key, endpoint_url=host,) + +bucket=s3.Bucket(bucketname) +for obj in bucket.objects.filter(): + print('{0}:{1}'.format(bucket.name, obj.key)) + +#For Python3 +x = input('Enter your access key:') +y = input('Enter your secret key:') +z = input('Enter your bucket name:') + +boto3connection(x,y,z) + +``` + +Save your file with **.py** extension and execute the following command in the terminal: + +``` +python3 + +``` + +Enter the access key, secret key and bucket name. If everything is correct, you should see output in the following format: **:**. \ No newline at end of file diff --git a/docs/s3/How-to-delete-large-S3-bucket-on-CloudFerro-Cloud.html.md b/docs/s3/How-to-delete-large-S3-bucket-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..2ef5e19 --- /dev/null +++ b/docs/s3/How-to-delete-large-S3-bucket-on-CloudFerro-Cloud.html.md @@ -0,0 +1,65 @@ +How to Delete Large S3 Bucket on CloudFerro Cloud[](#how-to-delete-large-s3-bucket-on-brand-name "Permalink to this headline") +=============================================================================================================================== + +**Introduction** + +Due to an *openstack-cli* limitation, removing S3 buckets with more then 10 000 objects will fail when using the command: + +``` +openstack container delete --recursive <> + +``` + +showing the following error error: + +``` +Conflict (HTTP 409) (Request-ID: tx00000000000001bb5e8e5-006135c488-35bc5d520-dias_default) clean_up DeleteContainer: Conflict (HTTP 409) (Request-ID:) + +``` + +**Recommended solution** + +To delete a large S3 bucket we can use **s3cmd**. + +In order to acquire access to your Object Storage buckets via s3cmd, first you have to generate your own EC2 credentials with the following tutorial: [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html) + +After that, you have to configure s3cmd as explained in the following article: [How to access private object storage using S3cmd or boto3 on CloudFerro Cloud](How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html) + +After this, you should be able to list and access your Object Storage. + +List your buckets with the command: + +``` +eouser@vm01:$ s3cmd ls +2022-02-02 22:22 s3://large-bucket + +``` + +Now you’re able to delete your large bucket with the command presented below, where **-r** means recursive removal. + +``` +s3cmd rb -r s3://large-bucket + +``` + +The bucket itself and all the files inside will be removed. + +``` +WARNING: Bucket is not empty. Removing all the objects from it first. This may take some time... +delete: 's3://large-bucket/example_file.jpg' +delete: 's3://large-bucket/example_file.txt' +delete: 's3://large-bucket/example_file.png' +... +... +... +Bucket 's3://large-bucket/' removed + +``` + +Your large bucket has been successfully removed and the list of buckets is empty. + +``` +eouser@vm01:$ s3cmd ls +eouser@vm01:$ + +``` \ No newline at end of file diff --git a/docs/s3/How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html.md b/docs/s3/How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b750b86 --- /dev/null +++ b/docs/s3/How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html.md @@ -0,0 +1,30 @@ +How to install s3cmd on Linux on CloudFerro Cloud[](#how-to-install-s3cmd-on-linux-on-brand-name "Permalink to this headline") +=============================================================================================================================== + +In this article you will learn how to install [s3cmd](https://github.com/s3tools/s3cmd) on Linux. **s3cmd** can be used, among other things, to: + +> * download files from EODATA repositories as well as to +> * store files in object storage available on CloudFerro Cloud, + +without mounting these resources as a file system. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Installing **s3cmd** using **apt** +> * Uninstalling **s3cmd** + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **A virtual machine or local computer** + +These instructions are for Ubuntu 22.04, either on a local computer or on a virtual machine hosted on CloudFerro Cloud cloud. + +Other operating systems and environments are outside of scope of this article and might require adjusting of the instructions accordingly. + +If you want to install **s3cmd** on a virtual machine hosted on CloudFerro Cloud cloud, follow one of these articles: \ No newline at end of file diff --git a/docs/s3/How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html.md b/docs/s3/How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..e955bd7 --- /dev/null +++ b/docs/s3/How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html.md @@ -0,0 +1,279 @@ +How to Mount Object Storage Container as a File System in Linux Using s3fs on CloudFerro Cloud[](#how-to-mount-object-storage-container-as-a-file-system-in-linux-using-s3fs-on-brand-name "Permalink to this headline") +========================================================================================================================================================================================================================= + +The following article covers mounting of object storage containers using **s3fs** on Linux. One of possible use cases is having easy access to content of such containers on different computers and virtual machines. For access, you can use your local Linux computer or virtual machines running on CloudFerro Cloud cloud. All users of the operating system should have read, write and execute privileges on contents of these containers. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Installing **s3fs** +> * Creating a file containing login credentials +> * Creating a mounting point +> * Mounting the container using **s3fs** +> * Testing whether mounting was successful +> * Dismount a container +> * Configuring automatic mounting +> * Stopping automatic mounting of a container +> * Potential problems with the way s3fs handles objects + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Machine running Linux** + +You need a machine running Linux. It can be a virtual machine running on CloudFerro Cloud cloud or your local Linux computer. + +This article was written for Ubuntu 22.04. If you are running a different distribution, adjust the commands from this article accordingly. + +No. 3 **Object storage container** + +You need at least one object storage container on CloudFerro Cloud cloud. The following article shows how to create one: [How to use Object Storage on CloudFerro Cloud](How-to-use-Object-Storage-on-CloudFerro-Cloud.html). + +As a concrete example, let’s say that the container is named **my-files** and that it contains two items. This is what it could look like in the Horizon dashboard: + +![mount-object-storage-s3fs-linux-06_creodias.png](../_images/mount-object-storage-s3fs-linux-06_creodias.png) + +With the proper **s3fs** command from this article, you will be able to access that container remotely but through a local file system. + +No. 4 **Generated EC2 credentials** + +You need to have EC2 credentials for your object storage containers generated. The following article will tell you how to do it: [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html). + +No. 5 **Knowledge of the Linux command line** + +Basic knowledge of the Linux command line is required. + +Step 1: Sign in to your Linux machine[](#step-1-sign-in-to-your-linux-machine "Permalink to this headline") +------------------------------------------------------------------------------------------------------------ + +Sign in to an Ubuntu account which has **sudo** privileges. If you are using SSH to connect to a virtual machine running on CloudFerro Cloud cloud, the username will likely be **eouser**. + +Step 2: Install s3fs[](#step-2-install-s3fs "Permalink to this headline") +-------------------------------------------------------------------------- + +First, check if **s3fs** is installed on your machine. Enter the following command in the terminal: + +``` +which s3fs + +``` + +If **s3fs** is already installed, the output should contain its location, which could look like this: + +``` +/usr/local/bin/s3fs + +``` + +If the output is empty, it probably means that **s3fs** is not installed. Update your packages and install **s3fs** using this command: + +``` +sudo apt update && sudo apt upgrade && sudo apt install s3fs + +``` + +Step 3: Create file or files containing login credentials[](#step-3-create-file-or-files-containing-login-credentials "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------------------------------- + +In this article, we are going to use plain text files for storing S3 credentials - access and secret keys. (If you don’t have the credentials yet, follow Prerequisite No. 4.) Each file can store one such pair and can be used to mount all object storage containers to which that key pair provides access. + +For each key pair you intend to use, create file name and a corresponding text file. The content of the file will be just one line, + +> * starting with access key, +> * followed by a colon, +> * followed by a secret key + +from that key pair. If the access key is **1234abcd** and the secret key is **4321dcba**, the corresponding text file should have the following content: + +``` +1234abcd:4321dcba + +``` + +Change permissions of each file containing a key pair to **600**. If such a file is called **.passwd-s3fs** and is stored in your home directory, the command for changing its permissions would be: + +``` +chmod 600 ~/.passwd-s3fs + +``` + +Step 4: Create mount points[](#step-4-create-mount-points "Permalink to this headline") +---------------------------------------------------------------------------------------- + +The files inside your object storage container should appear inside a folder of your choice. Such a folder will be called *mount point* in this article. You can use an empty folder from your file system for that purpose. You can also create new folder(s) to use as mount points. + +To keep things tidy, let us use in this example a standard Linux folder called **/mnt**, which is what system administrators use to mount other file systems. For each container, use the usual **mkdir** command to create a subfolder of **/mnt**. For instance: + +``` +sudo mkdir /mnt/mount-point + +``` + +Step 5: Mount a container[](#step-5-mount-a-container "Permalink to this headline") +------------------------------------------------------------------------------------ + +Here is a typical command to mount a container: + +``` +sudo s3fs my-files /mnt/mount-point -o passwd_file=~/.passwd-s3fs -o url=https://s3.waw3-1.cloudferro.com -o endpoint="waw3-1" -o use_path_request_style -o umask=0000 -o allow_other + +``` + +It goes without saying that you will need to change some of the parameters involved – but not all of them. Here is what to change and what to use as prescribed: + +**Edit container name and mount point** + +> * **my-files** is the name of the container +> * **/mnt/mount-point** is a directory in Linux file system which will be the mount point for that container + +**Edit key pair location** (note it starts with **-o**) + +> * **-o passwd\_file** - location of the file with the key pair used for mounting that container + +**Do not edit the following parameters** – just copy and paste verbatim + +> * **-o url** - the endpoint URL address +> * **-o endpoint** - the S3 region +> * **-o use\_path\_request\_style** - parameter that fixes issues with certain characters (such as dots) +> * **-o umask** - *umask* which describes permissions for accessing a container - in this case it is read, write and execute +> * **-o allow\_other** - allows access to the container to all users on the system + +Once you have executed the command, navigate to the directory in which you mounted the object storage container. If still using folder **/mnt/mount-point**, the command is: + +``` +cd /mnt/mount-point + +``` + +List contents of the container and be ready to wait a couple of seconds for the operation to be completed: + +``` +ls + +``` + +You should see files from your object storage container. + +Suppose you mounted object storage container under **/mnt/mount-point**, which contains + +> * a directory called **some-directory** and +> * a file named **text-file.txt**. + +This is what executing the **ls** command from the mount point could produce: + +![mount-object-storage-s3fs-linux-03_creodias.png](../_images/mount-object-storage-s3fs-linux-03_creodias.png) + +To mount multiple containers, repeat the **s3fs** command with relevant parameters, as many times as needed. + +Unmounting a container[](#unmounting-a-container "Permalink to this headline") +------------------------------------------------------------------------------- + +To unmount a container, first make sure that the content of your object storage is not in use by any application on your system, including terminals and file managers. After that, execute the following command, replacing **/mnt/mount-point** with the mount point of your object storage container: + +``` +sudo umount -lf /mnt/mount-point + +``` + +Configuring automatic mounting of your object storage[](#configuring-automatic-mounting-of-your-object-storage "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------- + +Here is how to configure automatic mounting of your object storage containers after system startup. + +Check the location under which **s3fs** is installed on your system: + +``` +which s3fs + +``` + +The output should contain the full location of the **s3fs** binary on your system. On Ubuntu virtual machines created using default images on CloudFerro Cloud cloud, it will likely be: + +``` +/usr/local/bin/s3fs + +``` + +Memorize or write it somewhere down, you will need it later. + +Open the file **/etc/fstab** for editing. You will need **sudo** permissions for that. For example, if you wish to use **nano** for this purpose, execute the following command: + +``` +sudo nano /etc/fstab + +``` + +Append the following line to it: + +``` +/usr/local/bin/s3fs#my-files /mnt/mount-point fuse passwd_file=/home/eouser/.passwd-s3fs,_netdev,allow_other,use_path_request_style,uid=0,umask=0000,mp_umask=0000,gid=0,url=https://s3.waw3-1.cloudferro.com,region=waw3-1 0 0 + +``` + +Replace the parameters from that line as follows: + +> * **/usr/local/bin/s3fs** with the full location of **s3fs** binary you obtained previously +> * **my-files** with the name of your object storage container +> * **/mnt/mount-point** with the full location of the directory which you chose as a mount point +> * **/home/eouser/.passwd-s3fs** with the full location of the file containing the key pair used to access your object storage container created in Step 3 + +Append such a line for every container you wish to have automatically mounted. + +Reboot your VM and check whether the mounting was successful by navigating to each mount point and making sure that the files from those object storage containers are there. + +Stopping automatic mounting of a container[](#stopping-automatic-mounting-of-a-container "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------- + +If you no longer want your containers to be automatically mounted, first make sure that each of them is not in use by any application on your system, including terminals and file managers. + +After that, unmount each container you wish to stop from automatic mounting. Execute the following command - replace **/mnt/mount-point** with the mount point of your first container - and repeat it for every other such container, if applicable. + +``` +sudo umount /mnt/mount-point + +``` + +Finally, modify the **/etc/fstab** file. + +To do that, open that file in your favorite text editor with **sudo**. If your favorite text editor is **nano**, use this command: + +``` +sudo nano /etc/fstab + +``` + +Remove the lines responsible for automatic mounting of containers you no longer want to be automatically mounted. If you followed this article, these lines were added while following its Step 6. + +Save the file and exit the text editor. + +You can now reboot your virtual machine to check if the containers are indeed no longer being mounted. + +Potential problems with the way s3fs handles objects[](#potential-problems-with-the-way-s3fs-handles-objects "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------- + +**s3fs** attempts to translate object storage to a file system and most of the time is successful. However, sometimes it might not be possible. One of potential problems with **s3fs** comes from the fact that object storage allows a folder and file to share the same name in the same location, which is outright impossible in normal operating systems. + +Here is a situation from the Horizon dashboard: + +![mount-object-storage-s3fs-linux-04_creodias.png](../_images/mount-object-storage-s3fs-linux-04_creodias.png) + +The first row contains an object named **item**, with size of 10 bytes. The second row has the object called **item** labeled in blue color, described as a folder. Both the “file” and the “folder” are represented in Horizon to look like regular file and regular folder from Linux or Windows – except that they are not. In **S3** terminology, the former is an object with the name ending in **item**, while the latter is an object with the name ending in **item/** (note it is ending with a slash). Since their names are different, they can coexist in object store based on **S3** standard. + +When above mentioned location is accessed by **s3fs**, the **ls** command will return only the folder: + +![mount-object-storage-s3fs-linux-05_creodias.png](../_images/mount-object-storage-s3fs-linux-05_creodias.png) + +To prevent this issue, invent and use consistent file system conventions while utilizing object storage. + +Another potential problem is that some changes to the object storage might not be immediately visible in file system created by **s3fs**. Wait a bit and double check to see whether that is the case. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You can also access object storage from CloudFerro Cloud without mounting it as a file system. + +Check the following articles for more information: \ No newline at end of file diff --git a/docs/s3/How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html.md b/docs/s3/How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html.md new file mode 100644 index 0000000..a99a0cc --- /dev/null +++ b/docs/s3/How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html.md @@ -0,0 +1,27 @@ +How to mount object storage container from CloudFerro Cloud as file system on local Windows computer[](#how-to-mount-object-storage-container-from-brand-name-as-file-system-on-local-windows-computer "Permalink to this headline") +===================================================================================================================================================================================================================================== + +This article describes how to configure direct access to object storage containers from CloudFerro Cloud cloud in **This PC** window on your local Windows computer. Such containers will be mounted as network drives, for example: + +![object-storage-windows-example1_creodias.png](../_images/object-storage-windows-example1_creodias.png) + +You will configure mounting using an account which has administrative privileges obtained using UAC (User Account Control). After this process, the container should be also be available on accounts which do not have such administrative privileges. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface . + +No. 2. **Object storage container** + +You need at least one object storage container on the CloudFerro Cloud cloud. If you do not have one yet, please follow this article: [How to use Object Storage on CloudFerro Cloud](How-to-use-Object-Storage-on-CloudFerro-Cloud.html) + +No. 3. **Generated EC2 Credentials** + +You need to generate EC2 credentials for your account. + +The following article contains information how to do it on Linux: [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html). + +If instead you want to do it on Windows, you will need to install the OpenStack CLI client first. Check one of these articles to learn more. \ No newline at end of file diff --git a/docs/s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html.md b/docs/s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..2ac12eb --- /dev/null +++ b/docs/s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html.md @@ -0,0 +1,244 @@ +How to use Object Storage on CloudFerro Cloud[](#how-to-use-object-storage-on-brand-name "Permalink to this headline") +======================================================================================================================= + +Object storage on CloudFerro Cloud cloud can be used to store your files in *containers*. In this article, you will create a basic container and perform basic operations on it, using a web browser. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Create a new object storage container +> * Viewing the container +> * Creating a new folder +> * Navigating through folders +> * Uploading a file +> * Deleting files and folders from a container +> * Enabling or disabling public access to object storage containers +> * Using a public link + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +Creating a new object storage container[](#creating-a-new-object-storage-container "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------- + +Login to the Horizon dashboard. Navigate to the following section: **Object Store > Containers**. + +You should see a list of object storage containers. By default, it will be empty: + +![use-object-storage-01_creodias.png](../_images/use-object-storage-01_creodias.png) + +To create a new object storage container, click the ![new-container](_images/use-object-storage-new-container_creodias.png) button. You should get the following form: + +![use-object-storage-02_creodias.png](../_images/use-object-storage-02_creodias.png) + +Enter the name of your choice for that container in the **Container Name** text field. + +In general, bucket names should follow domain name constraints: + +Warning + +Bucket names must be unique. + +Bucket names cannot be formatted as IP address. + +Bucket names can be between 3 and 63 characters long. + +Bucket names must not contain uppercase characters or underscores. + +Bucket names must start with a lowercase letter or number. + +Bucket names must be a series of one or more labels. Adjacent labels are separated by a single period (.). Bucket names can contain lowercase letters, numbers, and hyphens. Each label must start and end with a lowercase letter or a number. + +Bucket name cannot contain forward slashes (**/**). + +Note + +**Single-tenancy vs. multi-tenancy** + +On CREODIAS WAW3-1, WAW3-2 and FRA1-2 clouds, **single tenancy** is enabled. This means that two object storage containers on it cannot have an identical name. Avoid using common names such as **storage** or **files**. + +In this example, we will use the name **file-container** for our object storage container. Of course, your name should be different. + +Section **Container Access** has two options: + +**Public** +: It will generate a link. Anyone who has it will be able to access files stored on that object storage container, even if not being a member of CloudFerro Cloud cloud. + +**Not Public** +: This will not generate a link explained above. The container will only be available from within your project unless you set a bucket sharing policy (not covered in this article). + +Click on **Submit** and see new container in the list: + +![use-object-storage-03_creodias.png](../_images/use-object-storage-03_creodias.png) + +You may encounter the following error: + +![use-object-storage-04_creodias.png](../_images/use-object-storage-04_creodias.png) + +The reason for it might be that you are trying to create an object storage container which has the same name as another container. Try using a different name. + +Viewing the container[](#viewing-the-container "Permalink to this headline") +----------------------------------------------------------------------------- + +To view the content of the container, click its name on the list: + +![use-object-storage-05_creodias.png](../_images/use-object-storage-05_creodias.png) + +You should see files in the container. Initially, it should be empty. You can now create folders and upload files to this container. + +Creating a new folder[](#creating-a-new-folder "Permalink to this headline") +----------------------------------------------------------------------------- + +To create a new folder, click button: ![new-folder](_images/use-object-storage-new-folder_creodias.png). You should get the following form: + +![use-object-storage-06_creodias.png](../_images/use-object-storage-06_creodias.png) + +Enter the name for your folder in **Folder Name** text field. If you use a forward slash, it will create a tree of folders. For example, if you wish to create a folder called **place1** and inside that folder another folder called **place2**, enter the following: + +``` +place1/place2 + +``` + +Adding forward slash in the beginning of such directory structure is optional. The folders will be created relative to the directory you are currently in and not to the root directory of your object storage container. + +Click **Create Folder** to confirm. + +Navigating through folders[](#navigating-through-folders "Permalink to this headline") +--------------------------------------------------------------------------------------- + +To navigate to another folder on your object storage container, click its name. Folder names will be written in blue and in the **Size** column, the word **Folder** will be shown. + +Section above text field **Click here for filters or full text search** shows the folder you are currently in. It could, for example, look like this: + +![use-object-storage-07_creodias.png](../_images/use-object-storage-07_creodias.png) + +That would be directory **another-folder**, inside the **second-folder** directory, which, in turn, is inside the **first-folder** directory. + +Click the name of the folder you want to go to. + +Uploading a file[](#uploading-a-file "Permalink to this headline") +------------------------------------------------------------------- + +To upload a file to your object storage container, click the ![upload-file](_images/use-object-storage-upload_creodias.png) button. You should get the following window: + +![use-object-storage-08_creodias.png](../_images/use-object-storage-08_creodias.png) + +Click **Browse…** to open the file browser which can be used to choose a file which you wish to upload. Its look will vary depending on the operating system you are using and other factors. + +Once you have chosen the file, its name should be written in the **File** section, for example: + +![use-object-storage-09_creodias.png](../_images/use-object-storage-09_creodias.png) + +You can enter the name and location of the file in your object storage container in the **File Name** text field. This allows you to rename the file which you are uploading and to put it into a different folder. Forward slashes are used to specify the location of your object storage container in folder hierarchy relative to the folder you are currently in. If you enter a name of a folder which does not exist yet, it will be created. + +If you do not enter anything into **File Name** text field, the file will be uploaded to the folder you are currently in and it will not be renamed. + +Once you’re ready, click **Upload File**. If the upload was successful, you should receive this confirmation: + +![use-object-storage-success_creodias.png](../_images/use-object-storage-success_creodias.png) + +For example, let’s assume that you are in the root directory of your object storage container and you want to upload a file called **uploaded-file.txt** to the directory called **first-folder** located there. If that is the case, you should enter the following in the **File Name** text field: + +``` +first-folder/uploaded-file.txt + +``` + +Your file should then be uploaded to that directory: + +![use-object-storage-10_creodias.png](../_images/use-object-storage-10_creodias.png) + +Warning + +Having two files or two folders of the same name in the same directory is impossible. Having a file and folder under the same name in the same directory (extension is considered part of the name here) may lead to problems so it is best to avoid it. + +Deleting files and folders from a container[](#deleting-files-and-folders-from-a-container "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +### Deleting one file[](#deleting-one-file "Permalink to this headline") + +To delete a file from container, open the drop-down menu next to the **Download** button. + +![use-object-storage-16_creodias.png](../_images/use-object-storage-16_creodias.png) + +Click **Delete**. + +You should get the following request for confirmation: + +![use-object-storage-17_creodias.png](../_images/use-object-storage-17_creodias.png) + +Click **Delete** to confirm. Your file should be deleted. + +### Deleting one folder[](#deleting-one-folder "Permalink to this headline") + +If you want to delete a folder and its contents, click the ![delete-folder](_images/use-object-storage-delete-folder_creodias.png) button next to it. You should get the similar request for confirmation as previously. Like before, click **Delete** to confirm. + +### Deleting multiple files and/or folders[](#deleting-multiple-files-and-or-folders "Permalink to this headline") + +If you want to delete multiple files and/or folders at the same time, use checkboxes on the left of the list to select the ones you want to remove, for example: + +![use-object-storage-18_creodias.png](../_images/use-object-storage-18_creodias.png) + +You can also select all files and folders on a page by clicking the checkbox above the folders: + +![use-object-storage-19_creodias.png](../_images/use-object-storage-19_creodias.png) + +To delete selected items, click the ![delete-selected](_images/use-object-storage-delete-delete-selected_creodias.png) button to the right of the button used to create new folders. In this case you should also get the similar request for confirmation. Click **Delete** to confirm. + +Recommended number of files in your object storage containers[](#recommended-number-of-files-in-your-object-storage-containers "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +It is recommended that you do not have more than 1 000 000 (one million) files and folders in one object storage container since it will make listing them inefficient. If you want to store a large number of files, use multiple object storage containers for that purpose. + +Working with public object storage containers[](#working-with-public-object-storage-containers "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------- + +### Enabling or disabling public access to object storage containers[](#enabling-or-disabling-public-access-to-object-storage-containers "Permalink to this headline") + +During the creation of your object storage container you had an option to set whether it should be accessible by the public or not. If you wish to change that setting later, first find the name of the container you wish to modify in the container list. + +The details about that object storage container should appear like on the screenshot below – if not, click on its name to make it appear: + +![use-object-storage-11_creodias.png](../_images/use-object-storage-11_creodias.png) + +Check or uncheck the **Public Access** checkbox depending on whether you wish to enable or disable such access. + +If you enabled **Public Access**, a link to your object storage container will be provided. + +### Using a public link[](#using-a-public-link "Permalink to this headline") + +Once you have created a public link, enter it into the browser. You should see a list of all files and folders in your container, for example: + +![use-object-storage-13_creodias.png](../_images/use-object-storage-13_creodias.png) + +Forward slashes are being used as separators between files and folders in the directory paths. + +If you want to download a file from the root directory of your container, add its name to the link: + +![use-object-storage-14_creodias.png](../_images/use-object-storage-14_creodias.png) + +In this example, Firefox was used to access the file called **second-upload-file.txt** in the **file-container** object storage container. + +If you end a link for downloading a file with forward slash, it will download an empty file instead. + +To share a link used to download a particular file in another folder, add full location and name of the file within folder structure: + +![use-object-storage-15_creodias.png](../_images/use-object-storage-15_creodias.png) + +In this example, a file called **another-uploaded-file.txt** in the directory called **second-folder** from the **file-container** object storage container was accessed. + +Note that this method cannot be used to download folders. + +Warning + +If you share a link to one file from an object storage container, the recipient will be able to create download links for all other files on that object storage container. Obviously, this could be a security risk. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +Now that you have created your object storage container you can mount it on the platform of your choice for easier access. There are many ways to do that, for instance: \ No newline at end of file diff --git a/docs/s3/S3-bucket-object-versioning-on-CloudFerro-Cloud.html.md b/docs/s3/S3-bucket-object-versioning-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..6991e6d --- /dev/null +++ b/docs/s3/S3-bucket-object-versioning-on-CloudFerro-Cloud.html.md @@ -0,0 +1,2998 @@ +S3 bucket object versioning on CloudFerro Cloud[](#s3-bucket-object-versioning-on-brand-name "Permalink to this headline") +=========================================================================================================================== + +S3 bucket versioning allows you to keep different versions of the file stored on object storage. Here are some typical use cases: + +> * data recovery and backup +> * accidental deletion protection +> * collaboration and document management +> * application testing and rollbacks +> * change tracking for large datasets +> * file synchronization and archiving + +In this article, you will learn how to + +> * set up S3 bucket object versioning on CloudFerro Cloud OpenStack +> * download different versions of files and +> * set up automatic removal of previous versions. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to Horizon interface: . + +No. 2 **AWS CLI installed on your local computer or virtual machine** + +[AWS CLI](https://aws.amazon.com/cli/) is a free and open source software which can manage different clouds, not only those hosted by Amazon Web Services. In this article, you will use it to control your resources hosted on CloudFerro Cloud cloud. + +This article was written for Ubuntu 22.04. The commands may work on other operating systems, but might require adjusting. + +Here is how to install AWS CLI on Ubuntu 22.04: + +``` +sudo apt install awscli + +``` + +No. 3 **Generated EC2 credentials** + +To authenticate to CloudFerro Cloud cloud when using AWS CLI, you need to use EC2 credentials. If you don’t have them yet, check [How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html) + +No. 4 **Bucket naming rules** + +Over the course of this article, you will create several buckets. Make sure that you know the rules regarding what characters are allowed in bucket names. See section **Creating a new object storage container** of [How to use Object Storage on CloudFerro Cloud](How-to-use-Object-Storage-on-CloudFerro-Cloud.html) to learn more. + +No. 5 **Terminology: container vs. bucket** + +In this article, both “container” and “bucket” represent the same category of resources hosted on CloudFerro Cloud cloud. The former term is more often used by the Horizon dashboard and the latter term is more often used by AWS CLI. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Configuring and testing AWS CLI +> +> + Configure AWS CLI +> + Verify that AWS CLI is working +> * Assigning bucket names to shell variables +> +> > + Making sure that bucket names are unique +> * Creating a bucket without versioning +> * Enabling versioning on a bucket +> * Uploading file +> * S3 paths +> * Uploading another version of a file +> * Listing available versions of a file +> +> > + Example 1: One file, two versions +> > + Example 2: Multiple files, multiple versions +> * Downloading a chosen version of a file +> * Deleting objects on version-enabled buckets +> +> > + Setting up a deletion marker +> > + Removing deletion marker +> > + Permanently removing a file from version-enabled bucket +> * Using lifecycle policy to configure automatic deletion of previous versions of files +> +> > + Preparing the testing environment +> > + Setting up automatic removal of previous versions +> > + Deleting lifecycle policy +> * Suspending versioning +> +> > + Bucket on which versioning has never been enabled +> > + Suspending of versioning + +Configuring and testing AWS CLI[](#configuring-and-testing-aws-cli "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +Now follows how to configure AWS CLI for the first time; if it has been configured before, you might need to adjust the configuration according to the needs of this article. + +### Step 1: Configure AWS CLI[](#step-1-configure-aws-cli "Permalink to this headline") + +To configure AWS CLI, create a folder called **.aws** in your home directory: + +``` +mkdir ~/.aws + +``` + +In it, create a text file called **credentials** + +``` +touch ~/.aws/credentials + +``` + +Navigate to **.aws** folder: + +``` +cd ~/.aws + +``` + +This is how listing of the contents of your **.aws** folder could now look like: + +![s3-bucket-versioning-01_creodias.png](../_images/s3-bucket-versioning-01_creodias.png) + +Open file **credentials** in plain text editor of your choice (like **nano** or **vim**). If you are using **nano**, this is the command: + +``` +nano credentials + +``` + +Enter the following: + +``` +[default] +aws_access_key_id = <> +aws_secret_access_key = <> + +``` + +Replace **<>** and **<>** with your access and secret key, respectively. + +Save the file and exit the text editor.. + +The commands we provide in this article will have the appropriate endpoint already included, via the **--endpoint-url** parameter, and all you need to do is to select the command for the cloud that you are using. + +### Step 2: Verify that AWS CLI is working[](#step-2-verify-that-aws-cli-is-working "Permalink to this headline") + +Execute command **list-buckets** to list buckets: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-buckets \ +--endpoint-url https://s3.waw4-1.cloudferro.com + +``` + +``` +aws s3api list-buckets \ +--endpoint-url https://s3.waw3-1.cloudferro.com + +``` + +``` +aws s3api list-buckets \ +--endpoint-url https://s3.waw3-2.cloudferro.com + +``` + +``` +aws s3api list-buckets \ +--endpoint-url https://s3.fra1-2.cloudferro.com + +``` + +The output should be in JSON format. If you have a bucket named **bucket1** and another bucket named **bucket2**, this is how it could look like: + +``` +{ + "Buckets": [ + { + "Name": "bucket1", + "CreationDate": "2023-11-14T08:55:38.526Z" + }, + { + "Name": "bucket2", + "CreationDate": "2024-01-30T10:11:44.157Z" + } + ], + "Owner": { + "DisplayName": "my-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } +} + +``` + +Here: + +> * Value of key **Buckets** should contain a list of your buckets (names and creation dates) +> * Value of key **Owner** should contain name and ID of your project + +Note + +In this article, colors have been added to make JSON more legible. AWS CLI typically does not output colored text. + +Assigning bucket names to shell variables[](#assigning-bucket-names-to-shell-variables "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------- + +To differentiate between different buckets used in various examples of this article, we will use the following shell variables: + +bucket\_name1 +: used in majority of examples in this article + +bucket\_name2 +: for uploading file to non-root directory + +bucket\_name3 +: for using lifecycle policy + +bucket\_name4 +: bucket on which versioning has never been enabled, used as introduction to suspending of versioning + +bucket\_name5 +: example of suspending of versioning + +Choose names for these five buckets. Make sure to follow naming rules from Prerequisite No. 4. + +Assign the names to these variables, for example: + +``` +bucket_name1="versioning-test" +bucket_name2="examplebucket" +bucket_name3="testnoncurrent" +bucket_name4="no-versioning" +bucket_name5="anotherbucket" + +``` + +Important + +The shell variables will be valid as long as your terminal session is active. When you start a new terminal session, you will need to reassign these variables. Therefore, you should write them down somewhere so that you don’t lose them. + +To use content of a shell variable as an argument of a command, you need to prefix the name of the variable with **$**. An example command to create a bucket whose name is stored in variable **$bucket\_name1** (where **<>** is the URL of the endpoint): + +``` +aws s3api create-bucket \ +--endpoint-url <> \ +--bucket $bucket_name1 + +``` + +### Making sure that bucket names are unique[](#making-sure-that-bucket-names-are-unique "Permalink to this headline") + +If **single tenancy** is enabled on the cloud you are using, the name of your bucket needs to be unique for the entire cloud. Buckets called **versioning-test**, **examplebucket** etc. may well already exist. +If that is the case, the output from **create-bucket** command will look like this: + +``` +argument of type 'NoneType' is not iterable + +``` + +To create unique names, you can, for example, add a unique string to the base bucket name. Consider adding + +> * your initials, +> * date and time +> * a random number +> * a UUID (random string of characters and digits) + +or even a combination of these methods. + +As a practical example, on Ubuntu 22.04, use command called **uuidgen** to generate a UUID: + +``` +uuidgen + +``` + +The output should contain a UUID: + +``` +889fa8de-9623-4735-99c7-9f1567e2a965 + +``` + +Then you can copy this generated number and add it to the bucket name, for instance: + +``` +bucket_name1="versioning-test-889fa8de-9623-4735-99c7-9f1567e2a965" + +``` + +If needed, make sure to repeat this process for each variable. + +The best course of action is to store bucket names somewhere safe as there are two scenarios possible: + +Reusing the existing buckets +: Maybe the terminal was rebooted at some point but you want to continue working through the article. + Or, you have previously used the article to create several buckets and now you want to continue using them. + +Avoid using the existing buckets +: Go through the article without previous baggage, using a “clean slate” approach. This is what you would normally do when using the article for the very first time. + +Creating a bucket without versioning[](#creating-a-bucket-without-versioning "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +Command **create-bucket** will create a bucket under your chosen name (variable **$bucket\_name1**). + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +The output of this command should be empty if everything went well. + +Enabling versioning on a bucket[](#enabling-versioning-on-a-bucket "Permalink to this headline") +------------------------------------------------------------------------------------------------- + +To enable versioning on the bucket **$bucket\_name1**, use command **put-bucket-versioning**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +Note + +On Amazon Web Services, the presence of parameter **MFADelete** increases security by requiring two security factors when changing versioning status or removing file version. Here we disable it for simplicity. + +The output of this command should also be empty. + +Uploading file[](#uploading-file "Permalink to this headline") +--------------------------------------------------------------- + +Let’s say that we upload a file to the root directory of our container. Let the name of the file be **something.txt** and let it have the following content: **This is version 1**. + +![s3-bucket-versioning-02_creodias.png](../_images/s3-bucket-versioning-02_creodias.png) + +We are in the folder which contains that file and we execute command **put-object** to upload the file to our bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body something.txt \ +--key something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body something.txt \ +--key something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body something.txt \ +--key something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body something.txt \ +--key something.txt + +``` + +In this command, the values of parameters are: + +**--body** +: the name of the file within our local file system + +**--key** +: the location (like file name) under which the file is to be saved on the container. + +We get output like this: + +``` +{ + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf" +} + +``` + +This upload created the first version of the file. The ID of this version is **whrj2pDFrrFq0WLdH0zGzprfkebQykf** (value of key **VersionId**). You can write down it as you will use it again to access the bucket. + +The output also provides an **ETag** key, which is a hash of the object you uploaded. + +S3 paths[](#s3-paths "Permalink to this headline") +--------------------------------------------------- + +The parameter **--key** from **put-object** command may also be used in other commands to reference an already uploaded bucket in the container. + +If used without slashes, as in the example above, the file is in the root directory. + +If your file is outside of the root directory, value of parameter **--key** needs to include directory in which it is located. When providing this path, separate directories and files with forward slashes (**/**). Contrary to the Linux file system, do not add slash to the beginning of the path. If your bucket contains + +> * directory called **place1**, which contains +> * another directory, **place2**, which, in turn, contains +> * file called + +``` +myfile.txt + +``` + +this is how to specify its path for **--key** parameter: + +``` +--key place1/place2/myfile.txt + +``` + +To practice, you can create a new bucket whose name is stored in variable **$bucket2** + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name2 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name2 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name2 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name2 + +``` + +After that, you can create a file named **myfile.txt** and upload it to above mentioned directory of that bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name2 \ +--body myfile.txt \ +--key place1/place2/myfile.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name2 \ +--body myfile.txt \ +--key place1/place2/myfile.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name2 \ +--body myfile.txt \ +--key place1/place2/myfile.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name2 \ +--body myfile.txt \ +--key place1/place2/myfile.txt + +``` + +Uploading another version of a file[](#uploading-another-version-of-a-file "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +Let us now return to **$bucket\_name1** + +We already have file **something.txt** in the root directory of the container, in the cloud. + +Let’s use your local computer to modify it so that it contains string **This is version 2**. + +![s3-bucket-versioning-03_creodias.png](../_images/s3-bucket-versioning-03_creodias.png) + +Then, we use the same command, **put-object**, to upload the modified file to the same location on the bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--body something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--body something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--body something.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--body something.txt + +``` + +The output is similar, but this time it contains a different **VersionId**: **whrj2pDFrrFq0WLdH0zGzprfkebQykf**. + +``` +{ + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "VersionId": "t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN" +} + +``` + +To list all files in that bucket, execute command **list-objects** : + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw4-1.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw3-1.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw3-2.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.fra1-2.cloudferro.com + +``` + +The output will be similar to this: + +``` +{ + "Contents": [ + { + "Key": "something.txt", + "LastModified": "2024-08-23T10:32:30.259Z", + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "Size": 18, + "StorageClass": "STANDARD", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +Here is what the parameters mean: + +Key +: name and/or path of the file. + +LastModified +: timestamp of when the file was last modified. + +Etag +: the hash of the file. + +Size +: size of the file in bytes. + +StorageClass +: information regarding the storage class (STANDARD in this example). + +Owner +: information about your project - name (parameter **DisplayName**) and ID. + +In the example above, the bucket still contains only one file - **something.txt**. This upload overwrote it with a new version, but the previous version is still present. + +Listing available versions of a file[](#listing-available-versions-of-a-file "Permalink to this headline") +----------------------------------------------------------------------------------------------------------- + +### Example 1: One file, two versions[](#example-1-one-file-two-versions "Permalink to this headline") + +To list the available versions of files in this bucket, use **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +The output could look like this: + +``` +{ + "Versions": [ + { + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN", + "IsLatest": true, + "LastModified": "2024-08-23T10:32:30.259Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf", + "IsLatest": false, + "LastModified": "2024-08-23T10:19:24.943Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +It contains two versions we created previously. Each has its own ID, which is the value of parameter **VersionId**: + +Table 5 Key vs. VersionId[](#id1 "Permalink to this table") + +| | | +| --- | --- | +| **Key** | **VersionId** | +| something.txt | t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN | +| something.txt | whrj2pDFrrFq0WLdH0zGzprfkebQykf | + +Both of them are tied to the same file called **something.txt**. + +### Example 2: Multiple files, multiple versions[](#example-2-multiple-files-multiple-versions "Permalink to this headline") + +Let us now consider an alternative situation in which we have two files, and one of them has two versions. + +The output of **list-object-versions** could then look like this: + +``` +{ + "Versions": [ + { + "ETag": "\"adda90afa69e725c2f551e0722014726\"", + "Size": 575, + "StorageClass": "STANDARD", + "Key": "something1.txt", + "VersionId": "kv7QRQsfHhEe-T6c9g-v3uIPoyX6FTs", + "IsLatest": true, + "LastModified": "2024-08-26T16:10:49.979Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890qwertyuiopasdfghjklzxc" + } + }, + { + "ETag": "\"947073995b23baa9a565cf21bf56a2ba\"", + "Size": 6, + "StorageClass": "STANDARD", + "Key": "something2.txt", + "VersionId": "no1KrA3MbEtjIk1CnN5U.rTtFKFXSpj", + "IsLatest": true, + "LastModified": "2024-08-26T16:12:29.961Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890qwertyuiopasdfghjklzxc" + } + }, + { + "ETag": "\"7d7b28bafa5222d9083fa4ea7e97cff6\"", + "Size": 106, + "StorageClass": "STANDARD", + "Key": "something2.txt", + "VersionId": "gRYReY1SpVI3rS-Qp0NYDPofoAfGfc7", + "IsLatest": false, + "LastModified": "2024-08-26T16:11:21.584Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890qwertyuiopasdfghjklzxc" + } + } + ], + "RequestCharged": null + } + +``` + +Table 6 Key vs. VersionId[](#id2 "Permalink to this table") + +| | | +| --- | --- | +| **Key** | **VersionId** | +| something1.txt | kv7QRQsfHhEe-T6c9g-v3uIPoyX6FTs | +| something2.txt | no1KrA3MbEtjIk1CnN5U.rTtFKFXSpj | +| something2.txt | gRYReY1SpVI3rS-Qp0NYDPofoAfGfc7 | + +File **something1.txt** has one version, while file **something2.txt** has two versions.. + +Downloading a chosen version of the file[](#downloading-a-chosen-version-of-the-file "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------- + +Let us return to **$bucket\_name1**. + +To download version of file stored on that bucket called **something.txt** which has **VersionId** of **whrj2pDFrrFq0WLdH0zGzprfkebQykf**, we execute **get-object** command: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api get-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf \ +./something.txt + +``` + +``` +aws s3api get-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf \ +./something.txt + +``` + +``` +aws s3api get-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf \ +./something.txt + +``` + +``` +aws s3api get-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf \ +./something.txt + +``` + +In this command: + +--key +: is the name and/or location of the file on your bucket + +--version-id +: is the ID of the chosen version of the file + +./something.txt +: is the name and/or location on your local file system to which you want to download the file. Iff there is already a file there, it will be overwritten. + +The file should be downloaded and we should get output like this: + +``` +{ + "AcceptRanges": "bytes", + "LastModified": "Fri, 23 Aug 2024 10:19:24 GMT", + "ContentLength": 18, + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf", + "ContentType": "binary/octet-stream", + "Metadata": {} +} + +``` + +The file should be in our current working directory: + +![s3-bucket-versioning-04_creodias.png](../_images/s3-bucket-versioning-04_creodias.png) + +Displaying its contents with the **cat** command reveals that it is indeed the first version of that file: + +![s3-bucket-versioning-05_creodias.png](../_images/s3-bucket-versioning-05_creodias.png) + +Deleting objects on version-enabled buckets[](#deleting-objects-on-version-enabled-buckets "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------- + +AWS CLI includes command **delete-object** which is used to delete files stored on buckets. It behaves differently depending on the circumstances: + +> 1. On regular buckets, it will simply delete the specified file. +> 2. On version-enabled buckets, there are two possibilities: + +Version to be deleted is not specified +: The command will not delete the specified file but will, instead, place a deletion marker into the file. + +The version to be deleted is specified +: The specified version will be deleted permanently. + +Here are the examples for version-enabled buckets. + +### Setting up a deletion marker[](#setting-up-a-deletion-marker "Permalink to this headline") + +The command to delete files from buckets is **delete-object**. + +Let us try to delete file named **something.txt** from bucket **$bucket\_name1** and let us NOT specify the version: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt + +``` + +This command should return output like this: + +``` +{ + "DeleteMarker": true, + "VersionId": "A0hVZCX0z6yMrlmoYymeaGPT4nzInS2" +} + +``` + +The marker we just placed causes the file to be invisible when listing files normally. **VersionId** is useful if you, say, want to remove that marker and restore the file. + +To fully see the effect of **delete-object** command, we list objects again using **list-objects**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-objects \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-objects \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-objects \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-objects \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +This time, the output does not list any files - the file **something.txt** became invisible. + +If there are no files to list, you might get the following output: + +``` +{ + "RequestCharged": null +} + +``` + +or your output might be empty. + +If we list versions of files in our bucket using **list-object-versions**, for instance: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +we will see that the previous versions are still there: + +``` +{ + "Versions": [ + { + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN", + "IsLatest": false, + "LastModified": "2024-08-23T10:32:30.259Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf", + "IsLatest": false, + "LastModified": "2024-08-23T10:19:24.943Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "DeleteMarkers": [ + { + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + }, + "Key": "something.txt", + "VersionId": "A0hVZCX0z6yMrlmoYymeaGPT4nzInS2", + "IsLatest": true, + "LastModified": "2024-08-23T11:28:48.128Z" + } + ], + "RequestCharged": null +} + +``` + +Apart from the previously uploaded versions, a delete marker (key **DeleteMarkers**) with version ID of **A0hVZCX0z6yMrlmoYymeaGPT4nzInS2** can also be found. + +Note + +If your bucket contains additional files, they too will be listed here. + +Within the Horizon dashboard, the file is also “invisible”: + +![s3-bucket-versioning-06_creodias.png](../_images/s3-bucket-versioning-06_creodias.png) + +Even though the file cannot be seen, the size of the bucket is still displayed correctly - 36 bytes. Each stored version of each file adds to the total size. + +### Removing the deletion marker[](#removing-the-deletion-marker "Permalink to this headline") + +To restore the visibility of a file, delete its deletion marker by issuing command **delete-object** and specify the **VersionID** of the deletion marker: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id A0hVZCX0z6yMrlmoYymeaGPT4nzInS2 + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id A0hVZCX0z6yMrlmoYymeaGPT4nzInS2 + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id A0hVZCX0z6yMrlmoYymeaGPT4nzInS2 + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id A0hVZCX0z6yMrlmoYymeaGPT4nzInS2 + +``` + +In this command: + +> * **something.txt** is the name of the file +> * **A0hVZCX0z6yMrlmoYymeaGPT4nzInS2** is the **VersionID** of the deletion marker which was obtained while following the previous section of this article. + +Warning + +Make sure to enter the correct **VersionID** to prevent accidental deletion of important data! + +We get the following output: + +``` +{ + "DeleteMarker": true, + "VersionId": "A0hVZCX0z6yMrlmoYymeaGPT4nzInS2" +} + +``` + +Once again, let us list object versions using command **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +The delete marker no longer exists: + +``` +{ + "Versions": [ + { + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN", + "IsLatest": true, + "LastModified": "2024-08-23T10:32:30.259Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf", + "IsLatest": false, + "LastModified": "2024-08-23T10:19:24.943Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +And if we list files with **list-objects**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw4-1.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw3-1.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.waw3-2.cloudferro.com + +``` + +``` +aws s3api list-objects \ +--bucket $bucket_name1 \ +--endpoint-url https://s3.fra1-2.cloudferro.com + +``` + +the output once again shows one file - **something.txt**: + +``` +{ + "Contents": [ + { + "Key": "something.txt", + "LastModified": "2024-08-23T10:32:30.259Z", + "ETag": "\"ded190b85763d32ce9c09a8aef51f44c\"", + "Size": 18, + "StorageClass": "STANDARD", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +The file should now also be visible in Horizon again: + +![s3-bucket-versioning-07_creodias.png](../_images/s3-bucket-versioning-07_creodias.png) + +That on this screenshot, the visible file has size 18 bytes, whereas the total size of this bucket is 36 bytes. This is because the total size includes both stored versions of the file. + +### Permanently removing files from version-enabled bucket[](#permanently-removing-files-from-version-enabled-bucket "Permalink to this headline") + +You can delete versions of file stored in the bucket just like you can delete the previously mentioned delete marker. + +The two versions of file **something.txt**, **t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN** and **whrj2pDFrrFq0WLdH0zGzprfkebQykf** still exist in bucket **$bucket\_name1**. + +To delete the first version permanently, we use command **delete-object** similar to the one used to remove the deletion marker. The difference is that here we specify the **VersionID** which we want to remove. + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN + +``` + +We should get output like this: + +``` +{ + "VersionId": "t22ZzEq6kt5ILKFfLZgoeSzW.I9HVtN" +} + +``` + +When we list versions of files stored on bucket with **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +the output will show us only one version of one file: + +``` +{ + "Versions": [ + { + "ETag": "\"a4d8980efbd9b71f416595a3d5588b32\"", + "Size": 18, + "StorageClass": "STANDARD", + "Key": "something.txt", + "VersionId": "whrj2pDFrrFq0WLdH0zGzprfkebQykf", + "IsLatest": true, + "LastModified": "2024-08-23T10:19:24.943Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +In the Horizon dashboard, the total size of the bucket was reduced to 18 bytes: + +![s3-bucket-versioning-08_creodias.png](../_images/s3-bucket-versioning-08_creodias.png) + +If we delete the last version using command **delete-object**, + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf + +``` + +``` +aws s3api delete-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--key something.txt \ +--version-id whrj2pDFrrFq0WLdH0zGzprfkebQykf + +``` + +the last file from Horizon dashboard should disappear and the size of the bucket should be reduced to zero bytes: + +![s3-bucket-versioning-09_creodias.png](../_images/s3-bucket-versioning-09_creodias.png) + +If we now execute the **list-object-versions** command: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 + +``` + +we will see that there are no files or versions there: + +``` +{ + "RequestCharged": null +} + +``` + +Using lifecycle policy to configure automatic deletion of previous versions of files[](#using-lifecycle-policy-to-configure-automatic-deletion-of-previous-versions-of-files "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +“Noncurrent version” is any version of a file which is not the latest. In this section, we will cover how to configure automatic deletion of these versions after a specified amount of days. + +For this purpose, we will use function called “lifecycle policy”. + +This example covers configuring automatic removal of noncurrent versions of a file 1 day after a newer version of the same file has been uploaded. + +### Preparing the testing environment[](#preparing-the-testing-environment "Permalink to this headline") + +For testing, create bucket whose name is stored in variable **$bucket\_name3** and enable versioning: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://{{ s3_login }} \ +--bucket $bucket_name3 + +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +For the sake of this article, let us suppose that we are in a folder which contains the following two files: + +> * **mycode.py** +> * **announcement.md** + +The actual content of these files is not important here. + +We upload these files to **$bucket\_name3** using the standard **put-object** command: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body mycode.py \ +--key mycode.py + +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body announcement.md \ +--key announcement.md + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body mycode.py \ +--key mycode.py + +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body announcement.md \ +--key announcement.md + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body mycode.py \ +--key mycode.py + +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body announcement.md \ +--key announcement.md + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body mycode.py \ +--key mycode.py + +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body announcement.md \ +--key announcement.md + +``` + +To see these files after upload, execute **list-object-versions** on the bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +We get the following output: + +``` +{ + "Versions": [ + { + "ETag": "\"d185982da39fb33854a5b49c8e416e07\"", + "Size": 34, + "StorageClass": "STANDARD", + "Key": "announcement.md", + "VersionId": "r714CQ6MLAo4l300Fv9iBCqfNpESPpN", + "IsLatest": true, + "LastModified": "2024-10-04T14:51:26.015Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"6cf02e36dd1dc8b58ea77ba4a94291f2\"", + "Size": 21, + "StorageClass": "STANDARD", + "Key": "mycode.py", + "VersionId": ".qBE6Dx91dxnU7aYOzmBMM1qRg3QwAx", + "IsLatest": true, + "LastModified": "2024-10-04T14:51:41.115Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +To test automatic deleting of previous versions, we modify file named **mycode.py** on our local computer and upload it one more time using **put-object**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 \ +--body mycode.py \ +--key mycode.py + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 \ +--body mycode.py \ +--key mycode.py + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 \ +--body mycode.py \ +--key mycode.py + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 \ +--body mycode.py \ +--key mycode.py + +``` + +Executing **list-object-versions** again: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +confirms that one of the files has two versions while the other only has one version: + +``` +{ + "Versions": [ + { + "ETag": "\"d185982da39fb33854a5b49c8e416e07\"", + "Size": 34, + "StorageClass": "STANDARD", + "Key": "announcement.md", + "VersionId": "r714CQ6MLAo4l300Fv9iBCqfNpESPpN", + "IsLatest": true, + "LastModified": "2024-10-04T14:51:26.015Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"3a474b21ab418d007ad677262dfed5b6\"", + "Size": 39, + "StorageClass": "STANDARD", + "Key": "mycode.py", + "VersionId": "tYJ6IazGryIWjv4iwSM1mLTW4-AnhMN", + "IsLatest": true, + "LastModified": "2024-10-04T14:55:07.223Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"6cf02e36dd1dc8b58ea77ba4a94291f2\"", + "Size": 21, + "StorageClass": "STANDARD", + "Key": "mycode.py", + "VersionId": ".qBE6Dx91dxnU7aYOzmBMM1qRg3QwAx", + "IsLatest": false, + "LastModified": "2024-10-04T14:51:41.115Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +Contrary to other versions of files stored here, the first version of file **mycode.py** has **false** under the key **IsLatest**. This shows that this is not the latest version of that file. + +### Setting up automatic removal of previous versions[](#setting-up-automatic-removal-of-previous-versions "Permalink to this headline") + +The lifecycle policy is written in JSON. Create file named **noncurrent-policy.json** in your current working directory (doesn’t have to be the location of the file which contains your login credentials) and enter the following code into it: + +``` +{ + "Rules": [ + { + "ID": "NoncurrentVersionExpiration", + "Filter": { + "Prefix": "" + }, + "Status": "Enabled", + "NoncurrentVersionExpiration": { + "NoncurrentDays": 1 + } + } + ] +} + +``` + +Replace **1** with the number of days after which noncurrent versions are to be deleted. + +In this example, we will apply this policy to bucket **$bucket\_name1**. The command is **put-bucket-lifecycle-configuration**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 \ +--lifecycle-configuration file://noncurrent-policy.json + +``` + +``` +aws s3api put-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 \ +--lifecycle-configuration file://noncurrent-policy.json + +``` + +``` +aws s3api put-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 \ +--lifecycle-configuration file://noncurrent-policy.json + +``` + +``` +aws s3api put-bucket-lifecycle-configuration \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 \ +--lifecycle-configuration file://noncurrent-policy.json + +``` + +The output should be empty. + +To verify that the policy was applied, execute the **get-bucket-lifecycle-configuration** command: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +In the output, you should see the policy which you applied: + +``` +{ + "Rules": [ + { + "ID": "NoncurrentVersionExpiration", + "Filter": { + "Prefix": "" + }, + "Status": "Enabled", + "NoncurrentVersionExpiration": { + "NoncurrentDays": 1 + } + } + ] +} + +``` + +Versions of files which are not the latest should now be removed after 1 day. + +In this example, logging in after one day and executing **list-object-versions** again: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +reveals that the version of file **mycode.py** which is not the latest was deleted: + +``` +{ + "Versions": [ + { + "ETag": "\"d185982da39fb33854a5b49c8e416e07\"", + "Size": 34, + "StorageClass": "STANDARD", + "Key": "announcement.md", + "VersionId": "r714CQ6MLAo4l300Fv9iBCqfNpESPpN", + "IsLatest": true, + "LastModified": "2024-10-04T14:51:26.015Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"3a474b21ab418d007ad677262dfed5b6\"", + "Size": 39, + "StorageClass": "STANDARD", + "Key": "mycode.py", + "VersionId": "tYJ6IazGryIWjv4iwSM1mLTW4-AnhMN", + "IsLatest": true, + "LastModified": "2024-10-04T14:55:07.223Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +### Deleting lifecycle policy[](#deleting-lifecycle-policy "Permalink to this headline") + +Command **delete-bucket-lifecycle** deletes bucket lifecycle policy. This is how to do it on bucket **$bucket\_name3**. + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api delete-bucket-lifecycle \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api delete-bucket-lifecycle \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api delete-bucket-lifecycle \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api delete-bucket-lifecycle \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +The output of this command should be empty. + +To verify, we once again check the current lifecycle configuration: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +``` +aws s3api get-bucket-lifecycle-configuration \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name3 + +``` + +This command should return either an empty output or: + +``` +argument of type 'NoneType' is not iterable + +``` + +The policy should now no longer apply. + +Suspending versioning[](#suspending-versioning "Permalink to this headline") +----------------------------------------------------------------------------- + +If you no longer want to store multiple versions of files, you can suspend the versioning. + +### Bucket on which versioning has never been enabled[](#bucket-on-which-versioning-has-never-been-enabled "Permalink to this headline") + +To better understand how it works, let us start with a bucket in which versioning has never been enabled in the first place. + +On such a bucket, every file will only have one version which has one and the same ID, namely, **null**. + +If you upload another file under the same name, its **VersionID** will also be **null**, and will replace the previously uploaded file. + +#### Example[](#example "Permalink to this headline") + +For this example, we will create bucket **$bucket\_name4** on which versioning has never been enabled. + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +Buckets can, of course, contain files of various type. For the sake of this example, suppose that the bucket contains the following three files of various types: + +Table 7 File vs. the editor[](#id3 "Permalink to this table") + +| | | +| --- | --- | +| **File** | **Editor** | +| **document.odt** | LibreOffice | +| **screenshot1.png** | GIMP, Krita etc. | +| **script.sh** | nano, vim etc. | + +The actual content of these files is not important here. You can use the editors from this table to create the files and then upload them with **put-object**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body document.odt \ +--key document.odt + +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body screenshot1.png \ +--key screenshot1.png + +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body document.odt \ +--key document.odt + +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body screenshot1.png \ +--key screenshot1.png + +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name1 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body document.odt \ +--key document.odt + +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body screenshot1.png \ +--key screenshot1.png + +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body document.odt \ +--key document.odt + +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body screenshot1.png \ +--key screenshot1.png + +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name1 \ +--body script.sh \ +--key script.sh + +``` + +First, let’s try to execute the previously mentioned **list-object-versions** command on this bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +Example output: + +``` +{ + "Versions": [ + { + "ETag": "\"5064a9c6200fd7dae7c25f2ed01a6f8f\"", + "Size": 9639, + "StorageClass": "STANDARD", + "Key": "document.odt", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:19:02.425Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"e3fedcd58235e90e7a676a84cd6c7ee6\"", + "Size": 174203, + "StorageClass": "STANDARD", + "Key": "screenshot1.png", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:17:17.085Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"5600fdc5aa752cba9895d985a9cf709e\"", + "Size": 36, + "StorageClass": "STANDARD", + "Key": "script.sh", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:17:47.206Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +All of these files have only one version and it has **null** as its ID. + +Let’s say that we locally modify one of these three files (here we are using **script.sh**) and upload the modified version under the same name and key. + +For this purpose, from within the folder which contains our file, we execute the following **put-object** command: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name4 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name4 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name4 \ +--body script.sh \ +--key script.sh + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name4 \ +--body script.sh \ +--key script.sh + +``` + +For confirmation, we should get output containing the **ETag**: + +``` +{ + "ETag": "\"b6b82cb2376934bcf6877705bae6ac58\"" +} + +``` + +If we list object versions again with **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name4 + +``` + +we should get the output like this: + +``` +{ + "Versions": [ + { + "ETag": "\"5064a9c6200fd7dae7c25f2ed01a6f8f\"", + "Size": 9639, + "StorageClass": "STANDARD", + "Key": "document.odt", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:19:02.425Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"e3fedcd58235e90e7a676a84cd6c7ee6\"", + "Size": 174203, + "StorageClass": "STANDARD", + "Key": "screenshot1.png", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:17:17.085Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"b6b82cb2376934bcf6877705bae6ac58\"", + "Size": 60, + "StorageClass": "STANDARD", + "Key": "script.sh", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-10-02T10:16:11.589Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +Once again, there are three files, each with exactly one version stored. The file **script.sh** was overwritten during our upload - its parameters **Size**, **ETag** and **LastModified** (timestamp of last modification) have changed. + +### Suspending of versioning[](#suspending-of-versioning "Permalink to this headline") + +When you suspend the versioning, your bucket will start behaving similarly to a bucket on which versioning has never been enabled. All files uploaded from that moment on will have **null** as their **VersionId**. + +Let’s say that after suspending of versioning, you upload a file to the same **key** (name and location within the bucket) as a previously existing file. What happens next depends on whether the bucket already contains a version of that file with **VersionID** of **null**: + +> * If version which has **null** as its **VersionId** does not exist, the version you are uploading will become a new version of that file. +> * If version which has **null** as its **VersionId** does exist, the version you are uploading will overwrite the previous version of that file with **VersionId** of **null**. + +Either way, the newly uploaded version will have **VersionId** of **null**. + +This overwrite will also happen if version which has **null** as its **VersionId** is the only remaining version of the file. + +Suspending of versioning by itself will not, however, influence previously saved versions which do not have VersionId of **null**. You can delete them manually if you want to. + +In order to illustrate suspending of versioning, we will create a new bucket **$bucket\_name5**. First create this bucket: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api create-bucket \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +and then enable versioning on it: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Enabled + +``` + +Upload a few files to this bucket with **put-object** command. Make sure that at least one of them has multiple versions. + +In this example, our bucket contains the following files: + +Table 8 Key vs. VersionId[](#id4 "Permalink to this table") + +| | | +| --- | --- | +| **Key** | **VersionId** | +| file1.txt | CTv9FT1Wp9pxDZdlZXx2cJ5C2juPNA6 | +| file1.txt | eaJNZLZTqtPAq9l09Nrm-CN-UAVtFHQ | +| file2.txt | HVRcuAOQ.gpqiU50mJkdAj4bAvgfCFN | + +We can list all these versions using **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +The output: + +``` +{ + "Versions": [ + { + "ETag": "\"1f5f1ebe10ac3457ca87427e1772d71f\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "CTv9FT1Wp9pxDZdlZXx2cJ5C2juPNA6", + "IsLatest": true, + "LastModified": "2024-09-16T11:28:47.501Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "eaJNZLZTqtPAq9l09Nrm-CN-UAVtFHQ", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:10.006Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file2.txt", + "VersionId": "HVRcuAOQ.gpqiU50mJkdAj4bAvgfCFN", + "IsLatest": true, + "LastModified": "2024-09-16T11:28:20.830Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +To suspend versioning on this bucket, execute **put-bucket-versioning**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Suspended + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Suspended + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Suspended + +``` + +``` +aws s3api put-bucket-versioning \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 \ +--versioning-configuration MFADelete=Disabled,Status=Suspended + +``` + +The output of this command should be empty. + +We list versions of files again with **list-object-versions**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +``` +aws s3api list-object-versions \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 + +``` + +The output shows us that the previous versions of files have not been removed: + +``` +{ + "Versions": [ + { + "ETag": "\"1f5f1ebe10ac3457ca87427e1772d71f\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "CTv9FT1Wp9pxDZdlZXx2cJ5C2juPNA6", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:47.501Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "eaJNZLZTqtPAq9l09Nrm-CN-UAVtFHQ", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:10.006Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file2.txt", + "VersionId": "HVRcuAOQ.gpqiU50mJkdAj4bAvgfCFN", + "IsLatest": true, + "LastModified": "2024-09-16T11:28:20.830Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +We then + +> * modify the contents of previously uploaded file **file1.txt** on our local computer and +> * upload that file again, with **put-object**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +After successful upload, we again list all versions (command **list-versions**) of files in our bucket: + +``` +{ + "Versions": [ + { + "ETag": "\"4d3828bb564834c45a522e3492cbdf4a\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:31:01.968Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"1f5f1ebe10ac3457ca87427e1772d71f\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "CTv9FT1Wp9pxDZdlZXx2cJ5C2juPNA6", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:47.501Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "eaJNZLZTqtPAq9l09Nrm-CN-UAVtFHQ", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:10.006Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file2.txt", + "VersionId": "HVRcuAOQ.gpqiU50mJkdAj4bAvgfCFN", + "IsLatest": true, + "LastModified": "2024-09-16T11:28:20.830Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +The previous versions of this file were not replaced, but a new version of file **file1.txt** (which has **VersionId** of **null**), was uploaded. + +From now on, each uploaded file will be uploaded with **VersionId** of **null**. If this version of that file already exists, it will be replaced. + +To illustrate that, we + +> * once again modify the file **file1.txt** on our local computer and +> * upload this modified version again, using **put-object**: + +WAW4-1WAW3-1WAW3-2FRA1-2 + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw4-1.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-1.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.waw3-2.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +``` +aws s3api put-object \ +--endpoint-url https://s3.fra1-2.cloudferro.com \ +--bucket $bucket_name5 \ +--body file1.txt \ +--key file1.txt + +``` + +After this upload, we list versions one more time and get the following output: + +``` +{ + "Versions": [ + { + "ETag": "\"c96e9d7d1e4655b15493cc31ab7cfc24\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "null", + "IsLatest": true, + "LastModified": "2024-09-16T11:34:25.528Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"1f5f1ebe10ac3457ca87427e1772d71f\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "CTv9FT1Wp9pxDZdlZXx2cJ5C2juPNA6", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:47.501Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file1.txt", + "VersionId": "eaJNZLZTqtPAq9l09Nrm-CN-UAVtFHQ", + "IsLatest": false, + "LastModified": "2024-09-16T11:28:10.006Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + }, + { + "ETag": "\"174b29d6d688c2b34f6c1bb7361a8b7e\"", + "Size": 10, + "StorageClass": "STANDARD", + "Key": "file2.txt", + "VersionId": "HVRcuAOQ.gpqiU50mJkdAj4bAvgfCFN", + "IsLatest": true, + "LastModified": "2024-09-16T11:28:20.830Z", + "Owner": { + "DisplayName": "this-project", + "ID": "1234567890abcdefghijklmnopqrstuv" + } + } + ], + "RequestCharged": null +} + +``` + +Once again, there is only one version which has **null** as its ID - the upload overwrote the previous version. The date of last modification (**LastModified**) has changed. Its previous value was **2024-09-16T11:31:01.968Z** and now it is **2024-09-16T11:34:25.528Z** + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +AWS CLI is not the only available way of interacting with object storage. Other ways include: + +Horizon dashboard +: [How to use Object Storage on CloudFerro Cloud](How-to-use-Object-Storage-on-CloudFerro-Cloud.html) + +s3fs +: [How to Mount Object Storage Container as a File System in Linux Using s3fs on CloudFerro Cloud](How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html) + +Rclone +: [How to mount object storage container from CloudFerro Cloud as file system on local Windows computer](How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html) + +s3cmd +: [How to access object storage from CloudFerro Cloud using s3cmd](How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html) \ No newline at end of file diff --git a/docs/s3/Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html.md b/docs/s3/Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..267f724 --- /dev/null +++ b/docs/s3/Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html.md @@ -0,0 +1,161 @@ +Server-Side Encryption with Customer-Managed Keys (SSE-C) on CloudFerro Cloud[](#server-side-encryption-with-customer-managed-keys-sse-c-on-brand-name "Permalink to this headline") +===================================================================================================================================================================================== + +Introduction[](#introduction "Permalink to this headline") +----------------------------------------------------------- + +This guide explains how to encrypt your objects server-side with SSE-C. + +Server-side encryption is a way to protecting data at rest. SSE encrypts only the object data. Using server-side encryption with customer-provided encryption keys (SSE-C) allows to set your own keys for encryption. Server manages the encryption as it writes to disks and decryption when you access your objects. The only thing that you must manage is to provide your own encryption keys. + +SSE-C is working as on the moment of uploading an object. Server uses the encryption key you provide to apply AES-256 encryption to data and removes the encryption key from memory. To access the data again you must provide the same encryption key on the request. Server verifies whether provided key matches and then decrypts the object before returning the object data to you. + +Requirements[](#requirements "Permalink to this headline") +----------------------------------------------------------- + +* A bucket ([How to use Object Storage on CloudFerro Cloud](How-to-use-Object-Storage-on-CloudFerro-Cloud.html)) +* A user with the required access rights on the bucket + +* EC2 credentials ([How to generate and manage EC2 credentials on CloudFerro Cloud](../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html)) +* Have installed and configured aws + +If you have not used aws before: + +``` +$ sudo apt install awscli + +``` + +Then: + +``` +$ aws configure + +AWS Access Key ID [None]: +AWS Secret Access Key [None]: +Default region name [None]: +Default output format [None]: + +``` + +**SSE-C at a glance** + +> * *Only HTTPS* S3 rejects any requests made over HTTP using SSE-C. +> * If you send request erroneously using HTTP, for security you should discard the key and rotate as appropriate. +> * The ETag in the response is not the MD5 of the object data. +> * You are responsible for managing encryption keys and to which object they were used. +> * If bucket is versioning-enabled, each object version can have its own encryption key. + +Attention + +If you lose encryption key it means the object is also lost. Our servers do not store encryption keys, so it is not possible to access the data again without them. + +REST API[](#rest-api "Permalink to this headline") +--------------------------------------------------- + +To encrypt or decrypt objects in SSE-C mode the following headers are required: + +| Header | Type | Description | +| --- | --- | --- | +| x-amz-server-side​-encryption​-customer-algorithm | string | Encryption algorithm. Must be set to AES256 | +| x-amz-server-side​-encryption​-customer-key | string | 256-bit base64-encoded encryption key used in the server-side encryption process | +| x-amz-server-side​-encryption​-customer-key-MD5 | string | base64-encoded 128-bit MD5 digest of the encryption key according to [RFC 1321](https://www.rfc-editor.org/rfc/rfc1321). It is used to ensure that the encryption has not been corrupted during transport and encoding process. | + +Note + +MD5 digest of the key before base64 encoding. + +Headers apply to the following API operations: + +> * PutObject +> * PostObject +> * CopyObject (to target objects) +> * HeadObject +> * GetObject +> * InitiateMultipartUpload +> * UploadPart +> * UploadPart-Copy (to target parts) + +Example No 1 Generate header values[](#example-no-1-generate-header-values "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +``` +secret="32bytesOfTotallyRandomCharacters" +key=$(echo -n $secret | base64) +keymd5=$(echo -n $secret | openssl dgst -md5 -binary | base64) + +``` + +OR + +``` +openssl rand 32 > sse-c.key +key=$(cat sse-c.key | base64) +keymd5=$(cat sse-c.key | openssl dgst -md5 -binary | base64) + +``` + +Example No 2 aws-cli (s3api)[](#example-no-2-aws-cli-s3api "Permalink to this headline") +----------------------------------------------------------------------------------------- + +Upload an object with SSE-C encryption enabled + +``` +aws s3api put-object \ + --bucket bucket-name --key object-name \ + --body contents.txt \ + --sse-customer-algorithm AES256 \ + --sse-customer-key $key \ + --sse-customer-key-md5 $keymd5 \ + --endpoint-url https://s3.waw3-1.cloudferro.com + +``` + +Example No 3 aws-cli (s3)[](#example-no-3-aws-cli-s3 "Permalink to this headline") +----------------------------------------------------------------------------------- + +``` +aws s3 cp file.txt s3://bucket-name/ \ + --sse-c-key $secret \ + --sse-c AES256 \ + --endpoint https://s3.waw3-1.cloudferro.com + +``` + +Example No 4 aws-cli (s3 blob)[](#example-no-4-aws-cli-s3-blob "Permalink to this headline") +--------------------------------------------------------------------------------------------- + +``` +aws s3 cp file.txt s3://bucket/ \ +--sse-c-key fileb://sse-c.key \ +--sse-c AES256 \ +--endpoint https://s3.waw3-1.cloudferro.com + +``` + +Note + +At the moment **s3cmd** does not support SSE-C encryption. + +Downloading the encrypted object[](#downloading-the-encrypted-object "Permalink to this headline") +--------------------------------------------------------------------------------------------------- + +``` +aws s3api get-object --bucket \ + --key \ + --sse-customer-key $secret \ + --sse-customer-algorithm AES256 \ + --endpoint https://s3.waw3-1.cloudferro.com + +``` + +or + +``` +aws s3api get-object --bucket \ + --key \ + --sse-customer-key fileb:// \ + --sse-customer-algorithm AES256 \ + --endpoint https://s3.waw3-1.cloudferro.com + +``` \ No newline at end of file diff --git a/docs/s3/s3.html.md b/docs/s3/s3.html.md new file mode 100644 index 0000000..6b46763 --- /dev/null +++ b/docs/s3/s3.html.md @@ -0,0 +1,2 @@ +S3[](#s3 "Permalink to this headline") +======================================= \ No newline at end of file diff --git a/docs/windows/Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html.md b/docs/windows/Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..ab936dc --- /dev/null +++ b/docs/windows/Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html.md @@ -0,0 +1,68 @@ +Can I change my password through RDP on CloudFerro Cloud?[](#can-i-change-my-password-through-rdp-on-brand-name "Permalink to this headline") +============================================================================================================================================== + +In short: No, this is not possible. You have to be logged in when you want to change your password. Security measures requiring you to change your password on first login are not working with RDP and have to be disabled on administrative level. +This article will show you how to create and configure a new account which can access the VM using RDP without the need to immediately change the password. + +What We Are Going To Cover[](#what-we-are-going-to-cover "Permalink to this headline") +--------------------------------------------------------------------------------------- + +> * Creating an account on administrative level +> * Configuring the account for remote access + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Account** + +You need a CloudFerro Cloud hosting account with access to the Horizon interface: . + +No. 2 **Windows VM** + +You need a running Windows VM with Remote Access allowed, an Administrator account, and basic Windows knowledge. + +Step 1: Microsoft Management Console (mmc)[](#step-1-microsoft-management-console-mmc "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------- + +Log in as administrator, click on the Windows icon and type “mmc”. + +![run-mmc.png](../_images/run-mmc.png) + +Confirm the question with “Yes”, select File -> Add/Remove Snap-in… + +![snap-in.png](../_images/snap-in.png) + +Chose the snap-in “Local Users and Groups”, click “Add >”, “Finish”, and “OK” in the successive windows. + +Step 2: Create and configure a user account[](#step-2-create-and-configure-a-user-account "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------ + +Expand the snap-in and open the “Users” folder. There are already some default accounts available. +Right-click into the white area where the accounts are listed and select “New user…” from the menu. +Provide a user name and a password, full name and description are optional. +Deselect “User must change password at next logon” and click “Create”. + +![account-new.png](../_images/account-new.png) + +Right-click on the newly created account and select “Properties”. + +![account-menu.png](../_images/account-menu.png) + +Navigate to “Member Of” and click “Add…” + +![account-properties.png](../_images/account-properties.png) + +Click on “Advanced…” in the opening window, then “Find Now”. +Select “Remote Desktop Users” in the search results, click “OK” twice. + +![account-groups.png](../_images/account-groups.png) + +If everything was done right, the selected group is now listed. Click “Apply”, then “OK”. + +![account-final.png](../_images/account-final.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +You have successfully created a new user account and configured this account for remotely using the VM. +You can now forward the credentials and ask the user to change the password after logging in. \ No newline at end of file diff --git a/docs/windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html.md b/docs/windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..d1a2c6d --- /dev/null +++ b/docs/windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html.md @@ -0,0 +1,78 @@ +Connecting to a Windows VM via RDP through a Linux bastion host port forwarding on CloudFerro Cloud[](#connecting-to-a-windows-vm-via-rdp-through-a-linux-bastion-host-port-forwarding-on-brand-name "Permalink to this headline") +=================================================================================================================================================================================================================================== + +If you want to increase the security of your Windows VMs while connecting to them via RDP, you might want to use the method described in this article. It involves connecting to your Windows VM not directly through RDP, but through another virtual machine running Linux known as the “bastion host”. In this case, the RDP connection gets tunneled through SSH and is not directly visible to others. + +This method is especially useful if you fear that your RDP connection might be compromised or if using RDP without additional security measures is illegal. It also allows you to use a single floating IP address to connect to multiple Windows VMs. + +**Requirements:**[](#requirements "Permalink to this headline") +---------------------------------------------------------------- + +* Linux virtual machine with SSH access - bastion host +* Windows virtual machine located in the same network as the bastion host + +* The private key downloaded from OpenStack dashboard converted from .pem to .ppk format (using “PuTTYgen”) - for information on how to do this please see [How to access a VM from Windows PuTTY on CloudFerro Cloud](How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html) + +* The password for the Administrator account has been changed via the OpenStack dashboard console +* Your VMs are assigned the following security group: allow\_ping\_ssh\_icmp\_rdp + +![conn01.png](../_images/conn01.png) + +Step 1. Information required to establish connection with the bastion host.[](#step-1-information-required-to-establish-connection-with-the-bastion-host "Permalink to this headline") +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Launch PuTTY and change the settings according to the instructions: + +**Session** tab: Provide the host (bastion) floating IP address and the SSH port (default 22). + +![conn11b.png](../_images/conn11b.png) + +**Connection > Data** tab: Set auto-login username as “eouser”. + +![conn02b.png](../_images/conn02b.png) + +**Connection > SSH > Auth** tab: Select the private key in the .ppk format. + +![conn03b.png](../_images/conn03b.png) + +**Connection > SSH > Tunnels:** Provide the source port for the localhost RDP connection and destination (in the following format: *private IP address of Windows VM:RDP port* - as seen on the screenshot below). + +![conn04b.png](../_images/conn04b.png) + +Click the “Add” button to confirm the changes. + +Your forwarded port should now be visible in the upper tab. + +![conn05b.png](../_images/conn05b.png) + +Provide the name of the session and save your config to avoid repeating the whole process every time you would like to connect to your instance again. + +![conn10b.png](../_images/conn10b.png) + +Step 2. Open connection in PuTTy[](#step-2-open-connection-in-putty "Permalink to this headline") +-------------------------------------------------------------------------------------------------- + +Click “Open” to establish the connection. + +![conn06b.png](../_images/conn06b.png) + +Step 3. Start an RDP session to localhost to reach the destination server[](#step-3-start-an-rdp-session-to-localhost-to-reach-the-destination-server "Permalink to this headline") +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +Set *localhost address:port* selected in step 2 (in this case it is either 127.0.0.1:8888 or localhost:8888 - you can choose whatever you prefer). + +Set the username as “Administrator”. + +![conn07b.png](../_images/conn07b.png) + +Click “Connect” and enter your VM’s administrator password (the one you’ve set in the OpenStack console). + +![conn08b.png](../_images/conn08b.png) + +Confirm the connection in the certificate prompt. + +![conn09b.png](../_images/conn09b.png) + +That’s it, you’re now successfully connected to your Windows VM! + +![conn11.png](../_images/conn11.png) \ No newline at end of file diff --git a/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html.md b/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..69a8b02 --- /dev/null +++ b/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html.md @@ -0,0 +1,166 @@ +How to Create SSH Key Pair in Windows 11 On CloudFerro Cloud[](#how-to-create-ssh-key-pair-in-windows-11-on-brand-name "Permalink to this headline") +===================================================================================================================================================== + +This guide will show you how to generate an SSH key pair in Windows 11 using OpenSSH. You will then be able to use that key pair to control appropriately configured virtual machines hosted on CloudFerro Cloud cloud. + +This article only covers the basics of this function and assumes that you will not change the names of generated keys. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +No. 1 **Local computer running Windows 11** + +We assume that you have a local computer which runs Windows 11. This article does **not** cover the Windows Server family of operating systems. + +Step 1: Verify whether OpenSSH Client is installed[](#step-1-verify-whether-openssh-client-is-installed "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +Open the Command Prompt (**cmd.exe**). + +![create_ssh_key_windows_11-03_creodias.png](../_images/create_ssh_key_windows_11-03_creodias.png) + +Execute the following command and press Enter: + +``` +ssh + +``` + +If SSH client is installed, the output should contain information about how to use it: + +![create_ssh_key_windows_11-04_creodias.png](../_images/create_ssh_key_windows_11-04_creodias.png) + +If, however, you got the following output: + +``` +'ssh' is not recognized as an internal or external command, +operable program or batch file. + +``` + +it means that SSH client is not installed on your machine. + +Step 2: Install OpenSSH[](#step-2-install-openssh "Permalink to this headline") +-------------------------------------------------------------------------------- + +This step is only required if you don’t have SSH client installed. If you do have it, skip to Step 3. + +Minimize the Command Prompt if you still have it open. + +Open the system **Settings** application and enter section **System** -> **Optional features** + +![create_ssh_key_windows_11-07_creodias.png](../_images/create_ssh_key_windows_11-07_creodias.png) + +In section **Add an optional feature**, click **View features**. + +![create_ssh_key_windows_11-08_creodias.png](../_images/create_ssh_key_windows_11-08_creodias.png) +![create_ssh_key_windows_11-09_creodias.png](../_images/create_ssh_key_windows_11-09_creodias.png) + +In text field **Find an available optional feature**, enter **openssh** + +![create_ssh_key_windows_11-10_creodias.png](../_images/create_ssh_key_windows_11-10_creodias.png) + +Two features should be displayed: + +> * **OpenSSH Client** which you can use to control other devices. +> * **OpenSSH Server** which you can install to allow other devices to control your computer. This option is outside of scope of this article. + +Tick the checkbox next to **OpenSSH Client** and click **Next** + +![create_ssh_key_windows_11-11_creodias.png](../_images/create_ssh_key_windows_11-11_creodias.png) + +You should now get the following window: + +![create_ssh_key_windows_11-12_creodias.png](../_images/create_ssh_key_windows_11-12_creodias.png) + +Click **Add** + +Wait until the process is finished: + +![create_ssh_key_windows_11-13_creodias.png](../_images/create_ssh_key_windows_11-13_creodias.png) + +It might last several dozen minutes. + +Once it’s over, you should see the confirmation that the component was **Added** + +![create_ssh_key_windows_11-14_creodias.png](../_images/create_ssh_key_windows_11-14_creodias.png) + +Step 3: Use ssh-keygen to generate an SSH key pair[](#step-3-use-ssh-keygen-to-generate-an-ssh-key-pair "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------------- + +Return to the Command Prompt you previously opened. Enter the following command to generate an SSH key pair: + +``` +ssh-keygen + +``` + +![create_ssh_key_windows_11-15_creodias.png](../_images/create_ssh_key_windows_11-15_creodias.png) + +Of course, you can fine tune the security and other properties of this key pair during this process. However, if you’re just getting started, you can simply accept default values by pressing Enter multiple times until the program finishes its operation and you are once again prompted for enterring the command. + +![create_ssh_key_windows_11-16_creodias.png](../_images/create_ssh_key_windows_11-16_creodias.png) + +Your key pair should now be generated. + +As of writing of this article, by default this process should create: + +> * a directory **.ssh** in your home directory, and in that directory: +> +> > + file **id\_ed25519** for secret key, and +> > + file named **id\_ed25519.pub** for public key + +OpenSSH names these files based on algorithm used. As of writing of this article, the names of these files come from the Ed25519 algorithm. Previously, the RSA algorithm was used, and the files were by default called **id\_rsa** and **id\_rsa.pub** + +If in the future the default algorithm used by OpenSSH changes, the default names of keys will likely be different. + +Step 4: See generated key pair[](#step-4-see-generated-key-pair "Permalink to this headline") +---------------------------------------------------------------------------------------------- + +Open the **Run** window by pressing the key combination **Windows+R** (if you are using a macOS keyboard, then **Cmd+R**) + +Enter in its text field: + +``` +%USERPROFILE%\.ssh + +``` + +![create_ssh_key_windows_11-19_creodias.png](../_images/create_ssh_key_windows_11-19_creodias.png) + +You should get to **.ssh** folder which is located in your account profile folder. + +You should there see your SSH keys: + +![create_ssh_key_windows_11-20_creodias.png](../_images/create_ssh_key_windows_11-20_creodias.png) + +In our example, these are two files: + +> * **id\_ed25519** which is our private key +> * **id\_ed25519.pub** which is our public key + +Note that public SSH key and Microsoft Publisher documents share the same extension - **.pub** + +Because of that, Windows might mistakenly mark your public SSH key as a Microsoft Publisher document, as was the case on screenshot above. + +If you want to see the full extensions of files, including **.pub**, click **View** on the task bar of the File Explorer. After that, click **Show** -> **File name extensions** + +![create_ssh_key_windows_11-21_creodias.png](../_images/create_ssh_key_windows_11-21_creodias.png) +![create_ssh_key_windows_11-22_creodias.png](../_images/create_ssh_key_windows_11-22_creodias.png) + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +For Windows 10, see this guide: [How to Create SSH Key Pair in Windows 10 On CloudFerro Cloud](How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html) + +To be able to easily add your new public key to VMs you might create in the future, upload it to OpenStack. Thanks to that, you will be able to use it to authenticate to VMs which support it. + +Learn more here: + +[How to add SSH key from Horizon web console on CloudFerro Cloud](../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html) + +Once you’ve done it, you can create a new virtual machine on CloudFerro Cloud cloud and authenticate with your key pair: + +[How to create a Linux VM and access it from Windows desktop on CloudFerro Cloud](../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html) + +The following articles cover how to connect to virtual machines via SSH once they’ve already been created: \ No newline at end of file diff --git a/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html.md b/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..2f9364d --- /dev/null +++ b/docs/windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html.md @@ -0,0 +1,92 @@ +How to Create SSH Key Pair in Windows 10 On CloudFerro Cloud[](#how-to-create-ssh-key-pair-in-windows-10-on-brand-name "Permalink to this headline") +===================================================================================================================================================== + +This guide will show you how to generate an SSH key pair in Windows 10 using OpenSSH. + +Prerequisites[](#prerequisites "Permalink to this headline") +------------------------------------------------------------- + +> * System running Windows 10 or Windows Server 2016-2022 +> * User account with administrative privileges +> * Access to Windows command prompt + +Step 1: Verify if OpenSSH Client is Installed[](#step-1-verify-if-openssh-client-is-installed "Permalink to this headline") +---------------------------------------------------------------------------------------------------------------------------- + +First, check to see if you have the OpenSSH client installed: + +1. Open the **Settings** panel, then click **Apps**. +2. Under the *Apps and Features* heading, click **Manage optional Features**. + +![ssh_windows_1.png](../_images/ssh_windows_1.png) + +3. Scroll down the list to see if OpenSSH Client is listed. + +* If it’s not, click the plus-sign next to Add a feature. +* Scroll through the list to find and select OpenSSH Client. +* Finally, click Install. + +![ssh_windows_2.png](../_images/ssh_windows_2.png) + +This will install app called **ssh-keygen**. + +Step 2: Open Command Prompt[](#step-2-open-command-prompt "Permalink to this headline") +---------------------------------------------------------------------------------------- + +**ssh-keygen** runs from Windows Command Prompt, so the next step is to open it. + +1. Press the Windows key. +2. Type **cmd**. +3. Under **Best Match**, right-click **Command Prompt**. +4. Click Run as Administrator. + +![ssh_windows_3.png](../_images/ssh_windows_3.png) + +Step 3: Use OpenSSH to Generate an SSH Key Pair[](#step-3-use-openssh-to-generate-an-ssh-key-pair "Permalink to this headline") +-------------------------------------------------------------------------------------------------------------------------------- + +Finally, run **ssh-keygen** to generate the public and private keys for SSH access to the CloudFerro Cloud server. + +1. In command prompt, type the following: + +``` +ssh-keygen + +``` + +![ssh_windows_4.png](../_images/ssh_windows_4.png) + +Press **ENTER** three times. This will + +> * create folder **/.ssh** for the keys as well as +> * file **id\_rsa** for secret key and +> * file **id\_rsa.pub** for public key. + +These are the default values. + +Warning + +If you have created other keys in those same locations, you can define other folder and files instead of just pressing Enter three times. + +![ssh_windows_5.png](../_images/ssh_windows_5.png) + +To see the generated files, navigate to **C:/Users//.ssh** with your file explorer. + +![ssh_windows_6.png](../_images/ssh_windows_6.png) + +The image shows default values of files for private and public keys, in files **id\_rsa** and **id\_rsa.pub**, respectively. + +What To Do Next[](#what-to-do-next "Permalink to this headline") +----------------------------------------------------------------- + +For Windows 11, see this guide: [How to Create SSH Key Pair in Windows 11 On CloudFerro Cloud](How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html) + +Put your public key on remote server and use your private key to authorize to your VM. To add the public key to remote server see + +[How to add SSH key from Horizon web console on CloudFerro Cloud](../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html) + +To connect to the server from Windows: + +[How to connect to a virtual machine via SSH from Windows 10 Command Prompt on CloudFerro Cloud](How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html) + +[How to access a VM from Windows PuTTY on CloudFerro Cloud](How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html) \ No newline at end of file diff --git a/docs/windows/How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html.md b/docs/windows/How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b3c7e2b --- /dev/null +++ b/docs/windows/How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html.md @@ -0,0 +1,81 @@ +How to access a VM from Windows PuTTY on CloudFerro Cloud[](#how-to-access-a-vm-from-windows-putty-on-brand-name "Permalink to this headline") +=============================================================================================================================================== + +The link below shows how to generate and add rsa key pairs: + +[How to connect to a virtual machine via SSH from Windows 10 Command Prompt on CloudFerro Cloud](How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html.md) + +In this tutorial key.pem is equivalent to the id\_rsa file that we obtain in a zip package after the key generation process. + +To connect via PuTTY, copy your Virtual Machine floating IP address and save it somewhere. + +![Screenshot 1](../_images/01.png) + +Open PuTTYGen to converse the private key file to ppk format. (This format is being ussed by the PuTTY client). Click on the “Load” button. + +![Screenshot 2](../_images/02.png) + +Choose the key file. Make sure that you have set the visibility to “All files”. + +![Screenshot 3](../_images/03.png) + +A prompt window informing you about succesful import will appear. + +![Screenshot 4](../_images/04.png) + +Save your imported private key in the ppk format. + +![Screenshot 5](../_images/05.png) + +![Screenshot 6](../_images/06.png) + +Open PuTTY Configuration tool and focus on the marked labels: + +![07.png](../_images/07.png) + +**Description:** + +1. Host Name( or IP address) → Write down the floating IP address that you may find in the Horizon Panel +2. Port → Assign a SSH service port, by default it is set up on 22 +3. Connection type → Check SSH + +Configuration has been set up. Enroll the SSH branch. + +![08.png](../_images/08.png) + +Enroll the Auth branch and provide a private key file by clicking “Browse”, selecting your key and clicking “Open”. + +![09.png](../_images/09.png) + +![10.png](../_images/10.png) + +(Optionally) Expand the “Connection” list and click on the “Data”. + +Set Auto-login username: eouser. + +![11.png](../_images/11.png) + +For your comfort you can save the session for future use by naming it and saving changes. + +![12.png](../_images/12.png) + +Choose the proper session and click on the “Open” button to commence the ssh session: + +![13.png](../_images/13.png) + +If you are connecting to your VM via PuTTY for the first time, we recommend that you save the rsa key fingerprint by choosing Yes (Tak) for future connections from your computer. + +![14.png](../_images/14.png) + +If you logged in correctly you should see the following at the bottom of the screen: + +``` +eouser@yourInstanceName:~$ + +``` + +You are now correctly logged into your VM via SSH from another host. + +![15.png](../_images/15.png) + +If you would like to learn more about **PuTTYgen**, its installation and usage, visit the website . \ No newline at end of file diff --git a/docs/windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html.md b/docs/windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html.md new file mode 100644 index 0000000..b457a73 --- /dev/null +++ b/docs/windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html.md @@ -0,0 +1,50 @@ +How to connect to a virtual machine via SSH from Windows 10 Command Prompt on CloudFerro Cloud[](#how-to-connect-to-a-virtual-machine-via-ssh-from-windows-10-command-prompt-on-brand-name "Permalink to this headline") +========================================================================================================================================================================================================================= + +Requirements[](#requirements "Permalink to this headline") +----------------------------------------------------------- + +The private and public keys were created and saved on the local disk of your computer. ([How to create key pair in OpenStack Dashboard on CloudFerro Cloud](../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html)) + +During the virtual machine creation procedure, the generated key was attached. ([How to create new Linux VM in OpenStack Dashboard Horizon on CloudFerro Cloud](../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html)) + +A floating IP was assigned to your VM. ([How to Add or Remove Floating IP’s to your VM on CloudFerro Cloud](../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html)) + +Check in “Installed features” if the OpenSSH client is installed, if not click **Add a feature**, search for **OpenSSH client** and install it. + +![c1.png](../_images/c1.png) + +Step 1 Go to the folder containing your SSH keys[](#step-1-go-to-the-folder-containing-your-ssh-keys "Permalink to this headline") +----------------------------------------------------------------------------------------------------------------------------------- + +Run the Command Prompt and change the current folder to the folder where you store your keys. + +For example: + +``` +cd c:\Users\wikit\sshkeys + +``` + +Step 2 Connect to your VM using SSH[](#step-2-connect-to-your-vm-using-ssh "Permalink to this headline") +--------------------------------------------------------------------------------------------------------- + +If the name of your key is **id\_rsa** and the floating IP of your virtual machine is **64.225.129.203**, type the following command: + +``` +ssh -i id_rsa [email protected] + +``` + +If the text before the cursor changed to [eouser@test](/cdn-cgi/l/email-protection#b3d6dcc6c0d6c1959080848895908681889590878b88c7d6c0c7) (assuming the name of your virtual machine is **test**), the connection was successfully established. Before that, you may get the message that the authenticity of the host can’t be established and the following question: + +``` +Are you sure you want to continue connecting (yes/no/[fingerprint])? + +``` + +If you got that message, it typically means that your computer has never connected to your VM via SSH before and you should confirm that you are willing to connect by typing “yes” and pressing Enter. + +You should now be able to issue commands to your VM: + +![c4.png](../_images/c4.png) \ No newline at end of file diff --git a/docs/windows/windows.html.md b/docs/windows/windows.html.md new file mode 100644 index 0000000..1bf682d --- /dev/null +++ b/docs/windows/windows.html.md @@ -0,0 +1,2 @@ +WINDOWS[](#windows "Permalink to this headline") +================================================= \ No newline at end of file diff --git a/extract_docs_brave.py b/extract_docs_brave.py new file mode 100644 index 0000000..8d3fcfd --- /dev/null +++ b/extract_docs_brave.py @@ -0,0 +1,173 @@ +import time +import os +from urllib.parse import urljoin +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.chrome.options import Options +from webdriver_manager.chrome import ChromeDriverManager +import yaml +from bs4 import BeautifulSoup +import markdownify + +def scrape_cloudferro_docs(base_url): + # Set up Brave options + chrome_options = Options() + # Specify Brave binary location + chrome_options.binary_location = "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" + chrome_options.add_argument("--headless") # Run in headless mode + + # Initialize the WebDriver + try: + service = Service(ChromeDriverManager().install()) + driver = webdriver.Chrome(service=service, options=chrome_options) + except Exception as e: + print(f"Error initializing WebDriver: {e}") + return + + # Create project directory + project_dir = "cloudferro-docs" + docs_dir = os.path.join(project_dir, "docs") + os.makedirs(docs_dir, exist_ok=True) + + # Dictionary to store navigation structure + nav_structure = {} + visited_urls = set() + + def scrape_page(url, parent_path=""): + if url in visited_urls: + return + visited_urls.add(url) + + print(f"Scraping: {url}") + + try: + driver.get(url) + time.sleep(2) # Wait for page to load + except Exception as e: + print(f"Error loading {url}: {e}") + return + + # Parse page content with BeautifulSoup + soup = BeautifulSoup(driver.page_source, 'html.parser') + + # Extract main content (using the correct selector for CloudFerro docs) + content = soup.select_one('.rst-content .document') or soup.select_one('.document') + if not content: + print(f"No content found at {url}") + return + + # Convert HTML to Markdown + md_content = markdownify.markdownify(str(content), heading_style="ATX") + + # Extract page title for file name and nav + title = soup.select_one('h1') or soup.select_one('title') + page_title = (title.text.strip() if title else url.split('/')[-1]).replace(' ', '_').lower() + page_title = page_title.replace('/', '_').replace('?', '') + + # Create file path + relative_path = os.path.join(parent_path, f"{page_title}.md") + file_path = os.path.join(docs_dir, relative_path) + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + # Save Markdown content + with open(file_path, 'w', encoding='utf-8') as f: + f.write(md_content) + + print(f"Saved: {file_path}") + + # Update navigation structure + nav_path = parent_path.split('/') if parent_path else [] + current_nav = nav_structure + for part in nav_path: + for item in current_nav: + if isinstance(item, dict) and part in item: + current_nav = item[part] + break + current_nav.append({page_title.replace('_', ' ').title(): relative_path}) + + # Find and scrape linked pages (focusing on sidebar links) + links = soup.select('.wy-menu-vertical li a') # CloudFerro uses Read the Docs theme + for link in links: + href = link.get('href') + if not href or href.startswith('#') or href.startswith('mailto:') or href.startswith('javascript:'): + continue + absolute_url = urljoin(base_url, href) + if absolute_url.startswith(base_url) and absolute_url not in visited_urls: + new_parent_path = os.path.join(parent_path, page_title) if 'current' in link.get('class', []) else parent_path + scrape_page(absolute_url, new_parent_path) + + # Start scraping from the base URL + try: + scrape_page(base_url) + except Exception as e: + print(f"Error during scraping: {e}") + finally: + driver.quit() + + # Generate mkdocs.yml + mkdocs_config = { + 'site_name': 'CloudFerro Documentation', + 'site_url': 'https://cloudferro-docs.readthedocs.io', + 'theme': { + 'name': 'material', + 'palette': { + 'primary': 'blue', + 'accent': 'blue' + }, + 'features': [ + 'navigation.instant', + 'navigation.tracking', + 'navigation.tabs', + 'navigation.sections', + 'navigation.expand', + 'navigation.indexes', + 'toc.integrate', + 'content.code.copy' + ] + }, + 'nav': convert_nav_structure(nav_structure), + 'markdown_extensions': [ + 'admonition', + 'pymdownx.details', + 'pymdownx.superfences', + 'pymdownx.highlight', + 'pymdownx.inlinehilite', + 'toc', + 'tables' + ] + } + + with open(os.path.join(project_dir, 'mkdocs.yml'), 'w', encoding='utf-8') as f: + yaml.dump(mkdocs_config, f, allow_unicode=True, sort_keys=False) + + # Create requirements.txt + requirements = [ + "mkdocs>=1.5.0", + "mkdocs-material>=9.6.0", + "pymdown-extensions>=10.7", + ] + + with open(os.path.join(project_dir, 'requirements.txt'), 'w', encoding='utf-8') as f: + f.write('\n'.join(requirements)) + + print("\nScraping completed!") + print(f"Documentation has been generated in the {project_dir} directory") + print("To preview the documentation locally:") + print("1. Install requirements: pip install -r cloudferro-docs/requirements.txt") + print("2. Run local server: cd cloudferro-docs && mkdocs serve") + +def convert_nav_structure(nav): + result = [] + for item in nav: + if isinstance(item, dict): + for key, value in item.items(): + if isinstance(value, str): + result.append({key: value}) + else: + result.append({key: convert_nav_structure(value)}) + return result + +if __name__ == "__main__": + url = 'https://docs.cloudferro.com/en/latest/' + scrape_cloudferro_docs(url) diff --git a/extract_kpme_hospitals_brave.py b/extract_kpme_hospitals_brave.py new file mode 100644 index 0000000..0dc879d --- /dev/null +++ b/extract_kpme_hospitals_brave.py @@ -0,0 +1,76 @@ +import time +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +import pandas as pd + +def scrape_hospital_data(url): + # Initialize the WebDriver + service = Service(ChromeDriverManager().install()) + driver = webdriver.Chrome(service=service) + + # Open the webpage + driver.get(url) + + # List to store all hospital data + all_data = [] + + while True: + # Wait for the table to load + time.sleep(2) + + # Find the table by ID + table = driver.find_element(By.ID, 'ContentPlaceHolder1_gvw_list') + rows = table.find_elements(By.TAG_NAME, 'tr')[1:] # Skip the header row + + for row in rows: + cols = row.find_elements(By.TAG_NAME, 'td') + if len(cols) > 5: # Ensure the row has enough columns + system_of_medicine = cols[0].text + category = cols[1].text + establishment_name = cols[2].text + address = cols[3].text + certificate_validity = cols[4].text + certificate_number = cols[5].find_element(By.TAG_NAME, 'a').text + + # Append the data to the list + all_data.append([ + system_of_medicine, + category, + establishment_name, + address, + certificate_validity, + certificate_number + ]) + + # Check for the next page link + pagination = driver.find_elements(By.CLASS_NAME, 'pagination') + if pagination: + next_page_link = pagination[0].find_elements(By.TAG_NAME, 'a')[-1] # Assume the last link is 'Next' + if 'Next' in next_page_link.text: + next_page_link.click() + else: + break + else: + break + + # Close the WebDriver + driver.quit() + + # Convert the data to a DataFrame and save to CSV + df = pd.DataFrame(all_data, columns=[ + 'System of Medicine', + 'Category', + 'Establishment Name', + 'Address', + 'Certificate Validity', + 'Certificate Number' + ]) + df.to_csv('kpme_hospitals.csv', index=False) + print("Data saved to kpme_hospitals.csv") + +# URL of the KPME portal +url = 'https://kpme.karnataka.gov.in/AllapplicationList.aspx' +scrape_hospital_data(url) \ No newline at end of file diff --git a/fix_image_paths.py b/fix_image_paths.py new file mode 100644 index 0000000..96e9ebb --- /dev/null +++ b/fix_image_paths.py @@ -0,0 +1,27 @@ +import os +import re + +def fix_image_paths(file_path): + with open(file_path, 'r') as f: + content = f.read() + + # Fix Logo image at the top + content = content.replace('[![Logo](_images/', '[![Logo](../_images/') + + # Fix other image references + pattern = r'!\[\.\./_images/([^]]+)\]\(_images/([^)]+)\)' + content = re.sub(pattern, r'![\1](../_images/\2)', content) + + with open(file_path, 'w') as f: + f.write(content) + +def process_directory(dir_path): + for root, dirs, files in os.walk(dir_path): + for file in files: + if file.endswith('.md'): + file_path = os.path.join(root, file) + fix_image_paths(file_path) + +if __name__ == "__main__": + docs_dir = "/Users/dhanraj/Desktop/kpme_scraper/docs" + process_directory(docs_dir) diff --git a/kpme_hospitals.csv b/kpme_hospitals.csv new file mode 100644 index 0000000..01dfb5f --- /dev/null +++ b/kpme_hospitals.csv @@ -0,0 +1,1130 @@ +System_of_Medicine,Category,Establishment_Name,Address,Certificate_Validity,Certificate_No +Allopathy,Dental Lab or Clinic,happydent,"Times square building, 1st floor,Above KFC, Kadri, Mangalore-575002.",09 Oct 2025,DKA00008ALDEN +Allopathy,Dental Lab or Clinic,Caps & Crowns Dr.Haifa Dent Care,"Super Mart, Marnamikatte, Mangalore",20 Jan 2026,DKA00199ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,Dr.Gillians & Dr Chetans polyclinic,"Chetana nursing home premises, Mallundur road, chikkamagaluru",09 Jul 2028,CKM00304ALCWD +Allopathy,Dental Lab or Clinic,Susheela dentacare,"Sara arcade +Melkar",09 Oct 2025,DKA00028ALDEN +Homeopathy,Clinic/Polyclinic Only Consultation,Shri Sai Clinic,"Shivaji Road, Yallur",07 Feb 2026,BLG00109HOCOC +Allopathy,Dental Lab or Clinic,MAHAGANAPATHI DENTAL CLINIC,"MAHAGANAPATHI DENTAL CLINIC +SHIVAKRUPA BULDING, +NELLYADY +PUTTUR TQ",21 Dec 2025,DKA00170ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,MAKANDAR CLINIC,COLLEGE ROAD OPP DCC BANK NIDAGUNDI TQ B BAGEWADI DIST VIJAYAPR,28 Sep 2025,BIJ00111ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR T RATHNAKAR,"First Floor, Athena Hospital Complex, Falnir Road, Mangalore",09 Oct 2025,DKA00029ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,Dhanvantri Clinic,"Dhanvantri Clinic, Near Yallalingeshwar Medical, Sedam Road, Sulepeth,",08 Nov 2025,GLB00026HOCOC +Homeopathy,Clinic/Polyclinic Only Consultation,Makandar Clinic,Behind Quba Majid Kudachi-591311,10 Nov 2025,BLG00028HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Upadhye Dispensary,"Tarihal Road, Vijay Nagar, Halaga",10 Sep 2025,BLG00011AYCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SURAKSHA HOMEOPATHY HEALTHCARE,"#91, 19TH MAIN, 60 FEET ROAD, 6TH BLOCK, KORAMANGALA",06 Sep 2027,BLU03657HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,Saraswati Children Clinic,"Wari Complex, Opposite Corporation Office, Lamington Road, Hubli",01 Mar 2026,DWR00212ALCOC +Ayurveda,Clinic/Polyclinic with Observation,AIMAN CLINIC,"SUBHASH CIRCLE, STATION ROAD, HAVERI",11 Feb 2026,HVR00034AYCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,Dhatri Health Care,"Survey no. 3/2, Hagadur Colony, Near Sri Rama Temple, Immadihalli road, Whitefield",19 Oct 2028,BLU05747ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,"""SUDHANWA"", VYAVASAYA SEVA SAHAKARA SANGA, OPP. POLICE STATION, PUNJALKATTE",09 Nov 2025,DKA00105AYCWD +Allopathy,Clinic/Polyclinic with Dispensary,CLINIC,FARANGIPET,08 Feb 2026,DKA00277ALCWD +Allopathy,Dental Lab or Clinic,ZAHRA DENTAL CLINIC,"JANAKI DHAMA BUILDING, KAMBLA CROSS ROAD, KUDROLI , MANGALORE",20 Jan 2026,DKA00198ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,GAGAN CHILDRENS HOSPITAL,OPPOSITE JUNIOR COLLEGE THAIR MAIDAN HUMNABAD,07 Feb 2026,BDR00023ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SHREE RAKSHA CLINIC,"Zansi Laxmi Road, Tq.Alnavar, Dist.Dharwad.",19 Oct 2025,DWR00081HOCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,SWASTIKA HOSPITAL,"NEAR JAIL CIRCLE, KUVEMPU ROAD",17 May 2026,SMG00047ALSSH +Allopathy,Clinic/Polyclinic with Diagnostic Support,CLINRAD DIAGNOSTICS& RESEARCH CENTRE,"#725, CMH ROAD,NEAR CMH HOSPITAL. INDIRA NAGAR, BANGALORE-560038",15 Sep 2025,BLU00679ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,ASHWINI CLINIC,NEAR KSRTC DEPO NO 1 OPP MUNDEWADI HOSPITAL VISHAL NAGAR VIJAYAPUR,02 Apr 2026,BIJ00187AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,BALAJI CLINIC,MAIN ROAD KAVITHAL,26 Jun 2028,RCR00304AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,KRISHNA CLINIC,"No.40, Ground Floor, 1st Main Road, Saraswathipuram Main Road, Nandini Layout, Bangalore",10 Sep 2025,BLU00668ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,JEEVAMRUT CLINIC,"#60, Mahasati Nilaya, 7th Cross, Sangolli Rayanna Nagar, Dharwad",28 Sep 2025,DWR00039AYCOC +Allopathy,Medical Diagnostic Laboratory,Medical laboratory,"Deerghayu diagnostic centre, durga complex, baje road, Hiriyadka, udupi",26 Jan 2026,UDP00061ALMDL +Allopathy,Dental Lab or Clinic,DR. REDDYS CREATIVE SMILES,"# 301 , 1ST ‘D ' CROSS , 2ND ‘C’ MAIN , 8TH BLOCK , KORAMANGALA, BANGALORE",25 Sep 2025,BLU00757ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,PRIME ORTHOPEDICS,"NO 1309 , KANASU , 1ST FLOOR , 9TH CROSS , J.P NAGAR , 1ST +PHASE , BANGALORE",25 Sep 2025,BLU00767ALCOC +Allopathy,Dental Lab or Clinic,SHRI KAMAKSHI DENTAL CLINIC,"#2, Ground Floor, SKD Heights, Vidyanagar, P.B.Road, Hubballi.",19 Oct 2025,DWR00083ALDEN +Ayurveda,Clinic/Polyclinic Only Consultation,JYOTI CLINIC,"Rajput Building, Nekar Nagar Main Road, Tippu Nagar, Old Hubli, Hubballi.",28 Sep 2025,DWR00030AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Sree Ayyappan Temple Medical Centre,"Temple Community Hall Complex, Pipeline Road ,Prasanth Nagar , T Dasarahalli ,Bengaluru -560057",17 Sep 2025,BLU00707ALCOC +Allopathy,Clinic/Polyclinic with Observation,Wellcare Clinic,K.No.25.PRO.NO.152900402003400039 1st Floor Bangalore and Mysore Road,14 Apr 2026,RMG00015ALCWO +Allopathy,Diagnostic Imaging Centre,Rahi Diagnostics,"# 12-10-52/B, Kadam Factory Premises, Near Gandhi Chowk",11 Apr 2026,RCR00019ALDIC +Allopathy,Clinic/Polyclinic Only Consultation,Specialist Center,"1st Floor, Hemavathi Building, Balmatta, Mangalore",20 Nov 2025,DKA00162ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,Jeeva Kirana Clinic,"Jeeva Kirana Clinic, 5th Main Lenin Nagar Nituvalli",30 Mar 2027,DVG00284ALCOC +Ayurveda,AYUSH Therapy Centre,aadya health junction,"door no. 23, behind ramkrishna nursing college, bypass road, in front of A.I.T. girls hostel,kalyan nagar",11 Nov 2025,CKM00027AYATC +Ayurveda,AYUSH Therapy Centre,AAYUSHALAYA CLINIC,"Plot No. 93, Sumadhur Nivas, Vasavi Nagar, Near Vasavi Kalyan Mantap, Hubballi.",28 Sep 2025,DWR00031AYATC +Allopathy,Hospital (Level 2),BANASHANKARI NURSING HOME,7TH MAIN SADASHIVANAGARA TUMKUR - 572102 KARNATAKA INDIA,29 Nov 2025,TMK00050ALHL2 +Allopathy,Clinic/Polyclinic with Diagnostic Support,DAVANAGERE CLINIC,"NEAR TEMPLE +UCHANGI DURGA +HARAPANAHALLI",10 Jan 2026,BEL00078ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,VIJAY CLINIC,VIJAYA CLINIC DR SS KINAGI BAMBOO BAZAR FILTARE BED ROAD KALABURAGI,08 Nov 2025,GLB00028ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Vaishnavi Clinic,"Vaishnavi Clinic +Maruthi Colony +Arthani Road +Vijayapur",28 Sep 2025,BIJ00116AYCOC +Allopathy,Hospital (Level 1A),R.R.HOSPITAL,"nO.39/3, 2nd left, Flower Garden, Devasandra Main Road, K R Puram, Bangalore East Taluk.",08 Jul 2025,BLU00336ALH1A +Allopathy,Hospital (Level 1B),SIDDHI HOSPITAL INTENSIVE & TRAUMA CARE UNIT,CTS 1465 GANESHPUR GALLI SHAHAPUR,10 Sep 2025,BLG00012ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,Rani Channmma University Health Center,"NH-4 Highway Bhutaramatti,",10 Nov 2025,BLG00029ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SANGAMESHWAR CLINIC,RAJESHWAR BASVAKALYAN BIDAR,25 May 2026,BDR00040ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,SRI SAI CLINIC,"Assadi Complex, Permude Post, , Bajpe",09 Oct 2025,DKA00037AYCWD +Homeopathy,Clinic/Polyclinic Only Consultation,Chaitanya Clinic,"Shop No.1 Javali Complex Near Bus Stand, Beedi",10 Sep 2025,BLG00013HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Varasiddhi Clinic,Ballari Road Circle,12 Jul 2027,VIJ00033AYCOC +Allopathy,Hospital (Level 1B),PATIL METERNITY AND CHILDREN HOSPITAL,NEAR B.K.GUPTA HIGH SCHOOL RANEBENNUR,17 Dec 2025,HVR00012ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,SUJATHA CLINIC,"2, IMA HOUSE, NEW SAYYAJI RAO RAOD, MYSURU",24 Mar 2027,MYS00389ALCOC +Allopathy,Hospital (Level 1A),SHREE BASAVESHWAR HOSPITAL,NO 68 MANAS RESIDENCY JAIL DARGA ROAD VIJAYAPURA,09 Jun 2027,BIJ00464ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SONU CLINIC,VENKATESH NAGAR OPP SCHOOL NO 6 IBRAHIMPUR VIJAYAPUR,31 Jul 2026,BIJ00222AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SANJEEVINI CLINIC,KOLALA KORATAGERE TALUK TUMKUR DISTRICT,11 Dec 2029,TMK00917AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Shree Clinic,"Paras Garden, Beside Suraksha Hospital, Raichur",02 Mar 2026,RCR00014ALCOC +Allopathy,Medical Diagnostic Laboratory,V R S Scanning centre and Diagnostics,"Priya Complex, M G S Road, Nanjangud",31 Aug 2027,MYS00669ALMDL +Allopathy,Clinic/Polyclinic with Diagnostic Support,SKY DIAGNOSTIC CENTRE,#817/744 KK WHITE CASTEL APPARTMENT VIJAYA LAKSHMI COLONY KUMBENA AGRAHARA MAIN ROAD KADUGODI,15 Oct 2025,BLU00850ALCDS +Allopathy,Hospital (Level 1A),AASHRAYA NURSING HOME,"SREENIVAS NAGAR,NEAR GOVERNMENT HOSPITAL,LOKAPUR",10 Aug 2025,BGK00013ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,BOLOOR DISPENSARY,"Building +Boloor +Mangalore",28 Mar 2026,DKA00407ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,VINAY CLINIC,"BEHIND JAILAXMI MEDICAL STORES, +NEAR APJ ABDUL KALAM CIRCLE, +LG ROAD, +GANGAVATHI",03 Mar 2027,KPL00027AYCOC +Allopathy,Dental Lab or Clinic,National Smile Zone and Implant center Multi speciality Dental clinic,opp to shri veerbhadreshwar temple sangolli complex bailhongal,30 Aug 2029,BLG02453ALDEN +Allopathy,Dental Lab or Clinic,SATHYADEEP DENTAL CLINIC,"669 , 29THMAIN , 2ND STAGE , 1ST PHASE, BTM LAYOUT, BANGALORE,",23 Dec 2025,BLU01296ALDEN +Allopathy,Clinic/Polyclinic with Observation,MAMADAPUR NURSING HOME,"bazar road , near gandhi chowk",11 Jan 2026,BLG00105ALCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,KAMALA POLY CLINIC,"GANDHI NAGAR,SIRA",29 Aug 2026,TMK00208ALCDS +Allopathy,Hospital (Level 1A),JUPITER HOSPITAL,"#28, 7TH MAIN, 9TH CROSS, MALLESHWARAM",31 Jul 2025,BLU00447ALH1A +Allopathy,Dental Lab or Clinic,KUSHAL DENTAL CLINIC,"GUTHALU SCHOOL , COLLEGE GATE , OPP., GUTHAL ROAD",19 Feb 2026,MAN00087ALDEN +Homeopathy,Clinic/Polyclinic Only Consultation,Sai Health Care Clinic,"744/3, Muslim Galli Kakati",09 Jan 2029,BLG01659HOCOC +Allopathy,Medical Diagnostic Laboratory,BLUE SKY DIAGNOSTIC CENTER,"CSI LAYOUT 2ND CROSS NEAR MALABAR GOLD B.H.ROAD, TUMAKURU-572101.",07 Dec 2025,TMK00054ALMDL +Homeopathy,Clinic/Polyclinic Only Consultation,Patil Clinic,Near Bank Of India At.Basarikatti Post.Mastamaradi,16 Sep 2025,BLG00018HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,WOMENS CLINIC,"# 22, EWS 1ST STAGE, KUVEMPUNAGAR, MYSORE - 570021",31 Aug 2027,MYS00665ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Samruddhi Health Care,"No. 5/1, Fist Floor Hemmana Complex, 1,2,3 8th Mile Tumkur Road, NHS Bangalore 560073",31 Jul 2025,BLU00448ALCDS +Allopathy,Medical Diagnostic Laboratory,SHARADHA CLINIC AND LABORATORY,"BEHIND RAILWAY STATION, KAVERI SCHOOL ROAD, SHANTHINAGAR, TUMAKURU-572101",10 Jan 2026,TMK00088ALMDL +Allopathy,Clinic/Polyclinic with Observation,Aaditya Childrens clinic with Day Care,"MIG 1022, 9th Main 2nd Cross, Vivekananda Nagar, Mysore-23.",02 Sep 2026,MYS00129ALCWO +Allopathy,Medical Diagnostic Laboratory,MANIPAL CLINICAL LABORATORY,MAHALAKSHMI COMPLEX NEAR ARALIKATTE SHAKTHI GANAPATHI TEMPLE OPP KARNATAKA BANK MAIN ROAD KOPPA CHICKMAGALUR DIST,20 Nov 2025,CKM00033ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,SHREE CHOUDESHWARI CLINIC,MAIN ROAD MASHAL TQ. AFZALPUR DIST.KALABURAGI-585217,01 Jan 2026,GLB00111AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHARADA CLINIC,MAIN ROAD POTHNAL,21 Dec 2026,RCR00034AYCOC +Allopathy,Hospital (Level 1B),SPANDANA HOSPITAL,"# D-101/2, MOTHIKHANA BUILDING NEW SAYYAJI RAO RAOD, DEVARAJA MOHALLA, MYSURU",28 Jan 2026,MYS00004ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,SRI LALITHA CLINIC,"ANNIGERE VILLAGE AND POST, 9TH CROSS, KADURU TALUK",06 Jan 2026,CKM00040AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,DERMACARE SKIN HAIR AND AESTHETIC CLINIC,DERMACARE SKIN HAIR AND AESYHETIC CLINIC SANKESHWAR,04 Aug 2027,BLG00814ALCOC +Allopathy,Diagnostic Imaging Centre,CARE SCAN CENTRE,GROUND FLOOR HRJ COMPLEX COURT CIRCLE HADAGALI,28 Oct 2025,BEL00033ALDIC +Allopathy,Medical Diagnostic Laboratory,MALNAD CLINICAL LABORATORY,"Sri Guru Ice Creams Building +C. T. Road +Near Bus Stand +Hosanagara",14 Feb 2027,SMG00159ALMDL +Allopathy,Clinic/Polyclinic with Diagnostic Support,KAMAKHYA DIAGNASTIC HEALTH CENTRE AND RESEARCH LABOROTARY,"BLOCK NO.14 1ST FLOOR GANDHI BHAVAN BEHIND SALMAN HOTEL COLLEGE ROAD, BELAGAVI-590001",10 Nov 2025,BLG00037ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,GANGA SITARAM MEMORIAL DUDIHALLI CHILDRENS CLINIC,"Kabbur Road, Malamaddi, Dharwad.",03 Oct 2025,DWR00069ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,LAXMA REDDY HOSPITAL,Main Road Gurumatkal,09 Feb 2026,YDR00040ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,RAHAT HEALTH CARE,PLOT NO.4/5 R.S NO.59/1A BASAV COLONY BELAGAVI,11 Jan 2026,BLG00081HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,Dr. Banagar Clinic,"Station Road, Next to Merchants' Samudaya Bhavan, Ranebennur",06 Jun 2027,HVR00330ALCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,HOSMAT HOSPITAL PVT. LTD,"#1, Hennur Road, HBR Layout, Kalyannagar +Bengaluru 560043",28 Feb 2026,BLU01566ALSSH +Allopathy,Clinic/Polyclinic Only Consultation,DCKM HEALTHCARE AT ORTHOCARE,"#G-06, Raheja Plaza, Ashok Nagar, 17 Commissariet Road, Bangalore",24 Sep 2025,BLU00739ALCOC +Allopathy,Dental Lab or Clinic,MADNI DENTAL CLINIC,"# 551 , AECS MAIN ROAD , AECS LAYOUT , A - BLOCK , BANGALORE",25 Sep 2025,BLU00775ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,Maitreya Physiotherapy Centre,"G-6, Niketan Dollars Heights, Dollars Colony, Gokul road, Hubballi",21 Jan 2026,DWR00180ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SANJEEVINI CLINIC,AT/PO-MASAGUPPI TQ MUDALAGI,28 Feb 2026,BLG00184AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SRI PAMPAPATI AYURVEDA CLINIC,"SRI PAMPAPATI COMPLEX, OPP SVM COLLEGE, NEAR BUS STAND, ILKAL.",11 Nov 2025,BGK00040AYCOC +Ayurveda,Hospital (Level 4)(Teaching),SRI PARIPOORNA SANATHANA AYURVEDA HOSPITAL,"No. 91, Arjunabettahalli, Kasaba Hobli, Railway Gollahalli Post, Nelamangala Taluk",30 Dec 2026,BLR00110AYHL4 +Allopathy,Clinic/Polyclinic with Dispensary,ANMOL CLINIC,"ANMOL CLINIC, D NO 5-17G11, PETHRI COMMERCIAL CENTRE, CHERKADY POST, BRAHMAVARA, UDUPI",24 May 2026,UDP00131ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,MANVITH SURGICAL CARE,Brahmins Street Kolar,12 Aug 2026,KLR00053ALCOC +Allopathy,Diagnostic Imaging Centre,VAISHNAVI SCANNING AND IMAGING CENTRE,"H NO.10-2/10//1,OPP ICICI BANK, SB TEMPLE TO COURT ROAD, ANAND NAGAR, KALABURAGI-585102",23 Mar 2026,GLB00183ALDIC +Ayurveda,AYUSH Therapy Centre,SUKHAYU AYURVEDA KENDRA,"Behind united bank of india, beside shaineshwara temple, 1st cross SN Pet Ballari",13 Jun 2027,BEL00351AYATC +Allopathy,Diagnostic Imaging Centre,ULTRASOUND SCANNING CENTER,UNITY ZONE COPMLEX BESIDE NAGRESHWAR SCHOOL GUNJ KALABURAGI,11 Mar 2026,GLB00176ALDIC +Allopathy,Clinic/Polyclinic with Dispensary,Vijaya Childrens Clinic,"#162/A 1st main, 1st cross, Arekere Micolayout Bannerghatta Road",12 Sep 2029,BLU08980ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,SRI VEERABHADRESHWARA CHEST CLINIC,"DOOR N0 10, SRIJA TOWERS, KOLACHALAM COMPOUND, BALLARI",07 Sep 2026,BEL00267ALCOC +12345678910...,1,2,3,4,5 +Allopathy,Clinic/Polyclinic with Dispensary,YESHWANTHNAGARA HOSPITAL,"M/s The Sandur Manganese and Iron Ores Limited, Yeshwanth Nagara, Yeshwanth Nagara-Post, sandur- Taluk, Ballari -District , Pin 583124",08 Aug 2026,BEL00216ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,Bangalore Vascular Centre,"No.2589/1, 13th Main, E Block, Sahakara Nagar, Bangalore",30 Aug 2025,BLU00621ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR ABDUL BASHITH,"GROUND FLOOR, SEVEN CHOICE ARCADE, GT ROAD, KUDROLI, MANGALORE",03 Nov 2025,DKA00055ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,MOTHER & CHILD HEALTH CARE,"NO.47, 1ST A MAIN, 7TH BLOCK, KORAMANGALA, BANGALORE-560095",27 Aug 2025,BLU00572ALCDS +Homeopathy,Clinic/Polyclinic Only Consultation,DESAI CLINIC,"Nehru Nagar, Tq. Alnavar, Dist. Dharwad.",28 Sep 2025,DWR00041HOCOC +Homeopathy,Clinic/Polyclinic Only Consultation,DESAI CLINIC,"Nehru Nagar, Tq. Alnavar, Dist. Dharwad.",28 Sep 2025,DWR00042HOCOC +Allopathy,Clinic/Polyclinic with Observation,Pragathi Health Care Centre,"124 ,1st FLOOR , 1ST MAIN , 1ST CROSS , BAZAAR STREET , DOORAVANINAGAR POST, Udayanagar , BANGALORE",17 Sep 2025,BLU00713ALCWO +Allopathy,Clinic/Polyclinic with Observation,Abhinavashree Hospital,"Near Swami Vivekanada school, Lions Club Road, Koppal",17 Sep 2027,KPL00099ALCWO +Allopathy,Allied Health Professional Centre,IDHAM SPEECH LANGUAGE HEARING CLINIC,"FIRST FLOOR, PADMA COMPLEX, MOODBIDRI",25 Jun 2026,DKA00479ALAHC +Allopathy,Clinic/Polyclinic Only Consultation,MAHADESHWARA CLINIC,B M ROAD NEAR CORPORATION BANK KUNIGAL TOWN KUNIGAL TALUK TUMKUR DISTRICT-572130,24 Mar 2026,TMK00117ALCOC +Homeopathy,Clinic/Polyclinic with Dispensary,SAMRAKSHA HOMOEOPATHY CLINIC & DISPENSARY,"1ST FLOOR,TEJAL COMPLEX, 2ND KOLYA JUNCTION, AJJINADKA, KOTEKAR, MANGALORE",12 Jun 2027,DKA01041HOCWD +Allopathy,Clinic/Polyclinic Only Consultation,Women and Child Care,"#656,BSK 3RD STAGE,2ND PHASE, 7TH BLOCK, BANGALORE-560085",15 Sep 2025,BLU00676ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,NIKAD ORTHO CENTRE,"#1 , HAUDIN ROAD , OFF ULSOOR ROAD , ULSOOR , +BANGALORE",06 Sep 2025,BLU00647ALCOC +Allopathy,Medical Diagnostic Laboratory,Shri Manjunath High Tech Diagnostic Centre,Jeep Circle Ward No.1 Tq.Gokak Dt.Belagavi,19 Mar 2026,BLG00247ALMDL +Allopathy,Hospital (Level 1A),NDR MEDICAL CENTRE,OPP SBM BANK YELAHANKA OLD TOWN,17 Sep 2025,BLU00705ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SUSRUTHA CLINIC,"Opp. Darga, Raynal Gangiwal Circle, Devargudihal, Hubballi-580024",28 Sep 2025,DWR00050AYCOC +Allopathy,Dental Lab or Clinic,CLOVE DENTAL Star Dental Centre Private Limited,"373, First Floor, 80 Feet Road, Srinivasnagar 2nd Phase , Bengaluru, Karnataka",12 Oct 2025,BLU00832ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,TVACHA SKIN AND COSMETOLOGY CLINIC,"NO.G1.ASHRAYA APARTEMENT ,KAGGADASPURA MAIN ROAD ,C V RAMAN NAGAR,BENGALORE-560093",10 Sep 2025,BLU00658ALCOC +Allopathy,Clinic/Polyclinic with Observation,Smiles Mutlispeciality Clinic,"L167, Sector 6, 13th Cross, Outer Ring Road, HSR Layout, Bangalore",18 Oct 2025,BLU00854ALCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,JANAPRIYA DIAGNOSTIC CENTRE,"#77, JANAPRIYA COMPLEX, BHARAT ENCLAVE NEXT TO ADHESHWARA ELECTRICALS, SRIGANDADA KAVAL, MAGADI MAIN ROAD, BANGALORE-560091",15 Oct 2025,BLU00845ALCDS +Unani,Clinic/Polyclinic Only Consultation,R P HEALTH CARE CENTER,BEHIND JMIT CAMPUS TARALABALU NAGARA A BLOCK KADLEBHATTI ROAD CHITRADURGA,07 Feb 2026,CTR00031UNCOC +Allopathy,Clinic/Polyclinic with Observation,Aruna Clinic,"No.314, 7th Main, HRBR Layout, Kalyannagar, Bengaluru-560043",12 Nov 2025,BLU01125ALCWO +Ayurveda,Clinic/Polyclinic Only Consultation,KASTURI CLINIC,"CHITTAVALI CHOWK, TQ. CHITTAPUR DIST.KALABURAGI-585211",17 May 2026,GLB00205AYCOC +Allopathy,Hospital (Level 1A),GOBBUR HOSPITAL VIJAYAPUR,SHRINAGAR COLONY SOLAPUR ROAD VIJAYAPUR,24 Mar 2026,BIJ00184ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,Lakshmi Clinic,"LG04No 38 Smart Avenue complex, Nehru Road Kammanahalli",23 Nov 2025,BLU01193AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SAPTHAGIRI CLINIC,"Nanjundeshwara Building, Maruthinagara, Kempapura Road, Chikkabanavara, Bangalore",06 Sep 2027,BLU03674AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,JYOTI EYE CARE CENTRE,OPP .PKGB BANK BUTNAL ROAD TQ. JEWARGI DIST. KALABURAGI-585310,13 Oct 2025,GLB00011ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,NAYANA CLINIC,"No.1307/2, Kuvempu Circle, Vijinapura, Bangalore",08 Nov 2025,BLU01075AYCOC +Allopathy,Hospital (Level 2),SBREDTs SRI SATHYA SAI HOSPITAL,"Plot No. 19, Sattur, P. B. Road, Dharwad.",10 Nov 2025,DWR00106ALHL2 +Yoga and Naturopathy,AYUSH Therapy Centre,AROGYA MANDIRA TRUST,"148,1ST R BLOCK, NEAR ISCKON TEMPLE, RAJAJINAGAR,",08 Sep 2029,BLU08894YNATC +Allopathy,Clinic/Polyclinic Only Consultation,DR SUMAN CLINIC,NO 129/130 SIDDALINGAPPA BUILDING SARAKKI MAIN ROAD 1ST PHASE JP NAGAR,21 Jul 2026,BLU02109ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,M/S ACHARYA TULSI DIAGNOSTIC CENTRE AND DENTAL CARE A JAIN SOCIAL CHARITABLE ORGANIZATION,"NO 14/1, 80 FEET ROAD, VINAYAKANAGAR, SRINIVASANAGAR MAINROAD, BANGALORE-560050",15 Oct 2025,BLU00849ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,RAGHAVENDRA CLINIC,"ABOVE CANARA BANK, D B M ROAD, CHIKKABALLAPUR",12 Jan 2026,CBR00010ALCOC +Allopathy,Hospital (Level 1A),CARE & CURE HOSPITALS,"# 143, 2ND MAIN, 7TH CROSS, KENGERI SATELLITE TOWN, BANGALORE-560060",08 Nov 2025,BLU01095ALH1A +Allopathy,Specialty / Super-Specialty Specific Hospital,KERUDI HEALTHCARE PRIVATE LIMITED,"HALAMMA KERUDI CANCER AND HEART HOSPITAL, ROTARY CIRCLE, NAVANAGAR ROAD, BAGALKOT",28 Jan 2026,BGK00059ALSSH +Ayurveda,Clinic/Polyclinic with Dispensary,Swasthya Clinic,"Dr. Laxmikanth K L +Swasthya Clinic +Durga Complex +Hiriadka",26 Jan 2026,UDP00075AYCWD +Allopathy,Hospital (Level 1B),VENKATESH MATERNITY AND SCANNING CENTRE,NEAR VENKATESH THEATRE BESIDE SHRINIVAS PETROL PUMP GURLAPUR ROAD MUDALAGI,11 Jan 2026,BLG00097ALH1B +Allopathy,Hospital (Level 1A),MITHRA MULTISPECIALITY HOSPITAL,"#6, SR LAYOUT, KYALASANAHALLI VILLAGE, JIGANI TOWN, BANGALORE-560105",19 Nov 2025,BLU01143ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SOUDAGAR CLINIC,SOUDAGAR CLINIC OLD BAZAR KATIBASE SINDHANUR,26 Sep 2028,RCR00344AYCOC +Allopathy,Medical Diagnostic Laboratory,TANMAI LAB AND DIAGNOSTICS,"# 79 , 1ST MAIN , 1ST CROSS , SHAMBHAVINAGAR , G.K.W LAYOUT , PEENYA 2ND STAGE , BANGALORE -560058",22 Mar 2026,BLU01697ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,ASHOK CHILD CARE CENTRE,"JAWARI STREET, COWL BAZAAR, BALLARI",12 Jan 2028,BEL00431ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,RENUKA CLINIC,"BAZAR ROAD, AKKIALUR.",19 Jul 2027,HVR00386AYCOC +Allopathy,Health Check-up Centre,KSHEMA OCCUPATIONAL HEALTH CENTRE,"AUTOMOTIVE AXLES LIMITED +HOOTAGALLI INDUSTRIAL AREA +OFF HUNSUR ROAD, MYSORE",28 May 2028,MYS00837ALHCC +Allopathy,Clinic/Polyclinic with Observation,MEDITECH KIDNEY STONE CENTRE,"#35, HIG A Sector, Behind Hotel Sharavathi And Sub Register Office, Yelahanka New Town, Bengaluru - 560064",22 Mar 2026,BLU01698ALCWO +Allopathy,Dental Lab or Clinic,White Teeth dental clinic and orthodontic center,"First floor, Madhava Devadiga bulding, KBS, near railway gate, Jokatte, Mangalore",18 Jan 2029,DKA01936ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,NARAYANA MULTISPECIALITY CLINIC,"NO.83/3, DODDAKANNELLI, SARJAPUR MAIN ROAD, VARTHUR HOBLI, BANGALORE EAST TALUK-560037.",20 Mar 2026,BLU01665ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,Gangavati Clinic,Near Pankha Masjid,19 Sep 2027,BGK00501AYCOC +Allopathy,Clinic/Polyclinic with Dispensary,ABHANI HEALTHCARE CENTER,"#1525, D Group Layout,Annapoorneshwari Nagar, Srigandha kaval,Nagarbhavi 2nd Stage,Bangalore",31 Mar 2026,BLU01749ALCWD +Allopathy,Clinic/Polyclinic with Observation,GANGA MEDICARE CENTRE,"Shop no 3 and 4, MUNICIPAL COMMERCIAL COMPLEX,GANDHI SQUARE, NEW PET, ANEKAL",11 Apr 2026,BLU01804ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,THE ORTHOPAEDIC & FRACTURE CLINIC,"1ST FLOOR NETHRAVATHI BUILDING, BALMATTA, MANGALORE -",04 Jul 2026,DKA00485ALCOC +Allopathy,Hospital (Level 2),SONIA CLINIC AND NURSING HOME,24 ANANTHNAGAR MANIPAL,24 May 2026,UDP00112ALHL2 +Ayurveda,Clinic/Polyclinic with Observation,BANASHREE CLINIC,"NO. 16, 1ST A CROSS, 7TH MAIN ROAD, GOWTHAM NAGAR, SRIRAMPURAM, BENGALURU - 560021.",26 Jul 2028,BLU05116AYCWO +Allopathy,Clinic/Polyclinic Only Consultation,DANDI ADVANCED E.N.T. CLINIC,"Ground Floor, Manohar Heights, 1st Main Road, Shreya Nagar, Hubballi-580030",08 Oct 2027,DWR00540ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,CHANDOGYA AYURVEDICS,"#110, Om Tatsat Nilay, Vivekanand Nagar, Gokul Road, Hubballi-580030.",10 Dec 2026,DWR00407AYCOC +Allopathy,Hospital (Level 1A),VINAYA HOSPITAL,MAIN ROAD KUNDAPURA,02 Aug 2026,UDP00247ALH1A +Allopathy,Clinic/Polyclinic with Observation,HUBLI ASSISTED CONCEPTION CENTRE,"472/A,ward No 1, liberty Arcade, Opp.Vivekananda Hospital, Deshpande Nagar, Hubli",24 Jul 2026,DWR00324ALCWO +Allopathy,Hospital (Level 3)(Non-Teaching with Super Specialty Services),AGADI HOSPITAL AND RESEARCH CENTRE,"NO.35, H.SIDDAIAH ROAD, WILSON GARDEN",12 Sep 2027,BLU03710ALHL3 +Allopathy,Clinic/Polyclinic with Dispensary,JANANI MATERNITY AND WOMENS CLINIC,"NO. 395, 2ND FLOOR, 4TH MAIN TALAKAVERI LAYOUT, OFF AMRUTAHALLI MAIN ROAD, BANGALORE 560092",07 Jan 2026,BLU01337ALCWD +Allopathy,Medical Diagnostic Laboratory,BHISHAK DIAGNOSTIC LABORATORY,"# 3, Govt Press Layout, Near Andhra Bank, Ullal Main Road, Bengaluru-560056.",11 Mar 2026,BLU01640ALMDL +Allopathy,Hospital (Level 1A),VIJAYA MULTISPECIALITY HOSPITAL PVT LTD,NEAR DCC BANK KUMBARWADA,07 Feb 2026,BDR00019ALH1A +Allopathy,Hospital (Level 1A),SHREE MANYATA HOSPITALS,"NO.72/1, THANISANDRA MAIN ROAD, KRISHNARAJAPURA HOBLI, BANGALORE-560077.",27 Apr 2026,BLU01859ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,SHRI GURU CLINIC,"HORAPETE, NEAR OLD GOVT. HOSPITAL, MUDDEBIHAL",21 Jan 2027,BIJ00341ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Shri Laxmi Venkatesh clinic,Ashok Nagar MSK Mill Road kalaburagi,02 Aug 2028,GLB00798AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,SPANDANA ORTHO CLINIC,"Opp New Church, Kolagal Road, Vidhya Nagar",04 Jan 2027,BEL00298ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SHIVA SUPERSPECIALITY CLINIC,"D NO 272, W NO 3, OPP RANGAMANDIRA CIRCLE, BESIDE YERRITHATA BAKERY, NEW BUS STAND ROAD",08 Aug 2026,BEL00211ALCOC +Allopathy,Dental Lab or Clinic,HARSH DENTAL CARE,"NO 567 , 6TH CROSS , KALYAN LAYOUT , 2ND STAGE , +BHUVANESHWARINAGAR , BANGALORE -560056",13 Apr 2026,BLU01813ALDEN +Allopathy,Medical Diagnostic Laboratory,SHREE LAXMI CLINICAL LABORATORY,CHITTARAGI HOSPITAL NEAR AMBDEKAR CIRCLE TALIKOTI DIST VIJAYAPUR,21 Jan 2027,BIJ00342ALMDL +Allopathy,Dental Lab or Clinic,Prema dental clinic,"Bus stand road, Gokarna.",01 Jun 2027,UKA00170ALDEN +Allopathy,Dental Lab or Clinic,Datta Dental Clinic,"37/8, Bagalagunte Bus Stop, next to Shri Sai Sagar Hotel, Hesaraghatta Main Road, Bangalore 560073",02 Dec 2026,BLU02688ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,SWASTIKA WOMENS SPECIALITY AND HEART CENTRE,"#15/1, CAMBRIDGE ROAD, HALASUR, BANGALORE-560008",05 Apr 2026,BLU01772ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SRI VENKATESHWAR CLINIC,BEHIND KEB NEAR HANUMAN TEMPLE TQ.SEDAM DIST.KALABURAGI-585222,25 Sep 2027,GLB00618HOCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,ASHWINI POLYCLINIC,"GANESH MAHAL COMPLEX,OPP BISHOPS HOUSE,KODIALBAIL,MANGALURU",01 Jul 2027,DKA01125ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,SRI BALAJI CHILDREN CLINIC,C B ROAD HOLALKERE TALUK CHITRADURGA DIST,15 May 2026,CTR00081ALCOC +Allopathy,Diagnostic Imaging Centre,VISION DIAGNOSTIC AND CLINIC,"Bramhanath plaza , bedkihal circle ,shantinagar , shamanewadi",16 Sep 2026,BLG00398ALDIC +Allopathy,Clinic/Polyclinic with Dispensary,SAI KIRAN HOSPITAL,PLOT NO 28 BSSK LAYOUT SHIVNAGAR NORTH BIDAR,27 Jul 2026,BDR00052ALCWD +Allopathy,Medical Diagnostic Laboratory,SRL LIMITED,"#282, Kadrenahalli Layout, Jayanagar Housing Socienty ltd, BSK 2nd Stage, Padmanabhanagar, Bangalore",11 May 2026,BLU01929ALMDL +Allopathy,Dental Lab or Clinic,Lakeside Dental Care,"No-2, Hamilton Surabhi, Green Glen Layout, Bellandur outer ring road, Bengaluru, 560103",13 Apr 2026,BLU01814ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,INDUDHARA CLINIC,BEHIND TRAVELLARS BANGLOW NEAR K S F C BANK ROAD CHITRADURGA,15 May 2026,CTR00082ALCOC +Allopathy,Hospital (Level 1A),STAR MEDCITY SPECIALITY HOSPITAL,"No. 20, Shivram Karanth Nagar, Main Road, Near Bharath Petrol Bunk, Bangalore - 560077.",03 Jun 2026,BLU01982ALH1A +Allopathy,Dental Lab or Clinic,MY SMILE CARE,"#413,1ST FLOOR,ABOVE I GATE OPTICS,27TH MAIN,HSR LAYOUT,BANGALORE - 560102",31 Mar 2026,BLU01738ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,SANJEEVINI CLINIC,"Near Supreem Marriage Hall, Thadambail, Surathkal, Mangalore",17 Aug 2026,DKA00527AYCWD +Allopathy,Diagnostic Imaging Centre,PVR Diagnostics and Speciality Clinics,"K B Pillappa Complex, MG Road , Chikkaballapur",31 May 2026,CBR00038ALDIC +Allopathy,Diagnostic Imaging Centre,Haveri Scan Centre pvt ldt,"Bhagavati Building, Rajendra Nagar P B Road Haveri.",08 Sep 2026,HVR00205ALDIC +Allopathy,Diagnostic Imaging Centre,ACCURA DIAGNOSITCS & HEALTHCARE,"MIG-7 NEW KANTHARAJA URS ROAD, NEAR VIJAYA BANK CIRCLE, KUVEMPUNAGAR, MYSURU - 570023",20 Sep 2026,MYS00151ALDIC +Allopathy,Clinic/Polyclinic Only Consultation,CHILD CARE CENTRE,NEW TIMMAPURI COMPLEX S V P CHOWK KALABURAGI,31 Mar 2026,GLB00185ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SRI DHANAVANTHRI CLINIC,NAGANNA COMPLEX MAIN ROAD RAMANATHAPURA ARKALGUD TALUK,17 Oct 2026,HSN00070AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Nava Chaithanya Clinic,"#7 M.R.Complex, Opp to V.M.Medowds apts , Horamavu underpass, Horamavu Main Road , Bangalore 560113",29 Jul 2026,BLU02136AYCOC +Allopathy,Dental Lab or Clinic,Dr. Patels Dental & Implant Centre,"No.147, Ground Floor, 8th Cross, MCECHS Layout, Shivaramkaranth Nagar, Bengaluru - 560077",22 Mar 2028,BLU04395ALDEN +Allopathy,Hospital (Level 1A),AMRUTH HOSPITAL,"NO.01, AGRAHARA LAYOUT CROSS, BELLAHALLI MAIN ROAD, KOGILU LAYOUT, YELAHANKA, BANGALORE-560064.",13 Apr 2026,BLU01815ALH1A +Allopathy,Clinic/Polyclinic with Diagnostic Support,V R CHEST AND WOMEN CARE,"NO.356, ABHILASH COMPLEX, HENNUR MAIN ROAD, OPP.GRACE GARDEN APARTMENT, BANGALORE-560043.",07 May 2026,BLU01903ALCDS +Allopathy,Clinic/Polyclinic with Diagnostic Support,THANAL DAILYSIS CENTRE,"DAYA REHABILITATION TRUST +M G ROAD +SIDDAPUR",23 Jun 2026,KDG00029ALCDS +Ayurveda,AYUSH Therapy Centre,ANANTHA PADMA HEALTH CENTRE,SIDDAKATTE POST BANTWALA TQ,17 Jul 2029,DKA02320AYATC +Allopathy,Specialty / Super-Specialty Specific Hospital,GEM MULTI SPECIALITY HOSPITALS PVT LTD,"GEM MULTI SPECIALITY HOSPITALS PVT LTD +SHIVAYAN BUILDING +CTS NO 3359/2A/1A OPP RLS LINGARAJ COLLEGE ,COLLEGE ROAD BELAGAVI-590001",09 Jan 2029,BLG01668ALSSH +Allopathy,Dental Lab or Clinic,City Dental Clinic,Kannan Shoping Complex,01 Aug 2026,DKA00511ALDEN +Homeopathy,Clinic/Polyclinic with Dispensary,Sharma homeopathy clinic,"Double road, kuvempunagar,shivamogga",14 Feb 2027,SMG00140HOCWD +Allopathy,Dental Lab or Clinic,CLOVE DENTAL Star Dental Centre Private Limited,"No. 518, Sudhavana building, 1st floor, Above Poorvika Mobiles Pvt. Ltd., F Block, 60 feet road, Sahakar Nagar, Bengaluru, Karnataka",08 Nov 2025,BLU01063ALDEN +Allopathy,Dental Lab or Clinic,CLOVE DENTAL Star Dental Centre Private Limited,"No. 25/4, First floor, MS Ramaiah main road, above Domino's Pizza, Mathikere Extension, Mathikere, Bengaluru, Karnataka",08 Nov 2025,BLU01067ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,KIRAN DIAGNOSTIC CENTRE,"NO. 172/1, KATHRIGUPPE MAIN ROAD, BANASHANKARI 3RD STAGE, BANGALORE 560085",17 Sep 2025,BLU00698ALCDS +Ayurveda,AYUSH Therapy Centre,AYUSH UDAY CLINIC,"SOMANAHALLI VILLAGE AND POST +AKKI HEBBAL HOBLI +K R PETE TALUK +MANDYA DISTRICT",30 May 2026,MAN00145AYATC +Allopathy,Hospital (Level 1A),OXOR MERIDIAN HOSPITAL,"# 14, STANDAGE ROAD, OPP MOSQUE ROAD, FRAZER TOWN,BANGALORE-560005",15 Sep 2025,BLU00681ALH1A +12345678910...,1,2,3,4,5 +Allopathy,Clinic/Polyclinic Only Consultation,DR SHRIDHAR SHETTY,"First Floor, Athena Hospital Complex, Falnir Road, Manglaore",09 Nov 2025,DKA00101ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,Vijay Clinic,"No 75, 50 Feet Main Road Hanumanthnagar",07 Nov 2028,BLU05836ALCOC +Allopathy,Medical Diagnostic Laboratory,HERKAL DAIGANOSTIC LABORATORY,COLLEGE ROAD NIDAGUNDI TQ B BAGEWADI DIST VIJAYAPUR,28 Sep 2025,BIJ00112ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,SHIRSHYAD CLINIC,RAYYAN COMPLEX JAMAKHANDI ROAD NEAR BABALESHWAR NAKA VIJAYAPUR,28 Sep 2025,BIJ00114AYCOC +Allopathy,Clinic/Polyclinic with Dispensary,MANJUNATHA CLINIC,"Next to Post Office,Yeyyadi,Konchady",05 Nov 2025,DKA00064ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,SRI AMBICA CLINIC,"HULIYAR ROAD, BANAVARA",17 Jun 2027,HSN00199ALCOC +Allopathy,Medical Diagnostic Laboratory,Jeevan Regional Diagnostic,"CTS No 3361 Opposite Lingaraj College, College Road, Belagavi",07 Feb 2026,BLG00110ALMDL +Allopathy,Diagnostic Imaging Centre,SRL Diagnostics Pvt Ltd KCDC,"No.L25/2A, Irwin road, Mysore",28 Jan 2026,MYS00013ALDIC +Ayurveda,Clinic/Polyclinic with Dispensary,Sahana Ayurveda Clinic,"#9-7, Near Police Station, Venoor village and post",28 Mar 2026,DKA00404AYCWD +Ayurveda,AYUSH Therapy Centre,aeisirii House of Ayurveda and Integrative Wellness,#644 6th Main 8th Cross HAL 3rd Stage Bengaluru 75,02 Oct 2025,BLU00786AYATC +Allopathy,Clinic/Polyclinic with Dispensary,DRSHETTYS CLINIC,"#6-101, NEST, MRPL ROAD, SURATHKAL,, MANGALORE",20 Nov 2025,DKA00161ALCWD +Allopathy,Dental Lab or Clinic,Partha Dental Care India Pvt Ltd,"No.106, 1st Floor, 6th Cross Kundalahalli Colony, , Brookefield, ITPL Main Road, Bengaluru - 560037",03 Dec 2025,BLU01207ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,CHILD CARE CENTRE,"UPSTAIRS, 7 HILLS SUPERMARKET, 1ST CROSS, SATHYANARAYA PET 1ST CROSS",17 Dec 2025,BEL00056ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,VIJAYA CLINIC,SHANKAR MUTT ROAD,02 Dec 2027,HSN00257ALCOC +Allopathy,Hospital (Level 2),SURAKSHA CHILDRENS HOSPITAL,SY NO 134/1 NAKA NO 1 GOKAK TQ GOKAK DIST BELAGAVI,10 Nov 2025,BLG00034ALHL2 +Allopathy,Dental Lab or Clinic,RADHA DENTAL CLINIC,3-5 MAIN ROAD UPPINANGADY,15 Mar 2027,DKA00712ALDEN +Allopathy,Dental Lab or Clinic,Shetty Dental & X Ray Clinic,"Shetty Dental and X-ray Clinic, 1st floor, B.R.N. Complex, Car Street, Near B.S.V. Shed, Chamarajanagar",09 Jul 2026,CNR00005ALDEN +Allopathy,Hospital (Level 1A),SRUSHTI SPECIALITY HOSPITAL DAVANAGERE,"#605/A, TARALABALU BADAVANE , 2ND STAGE , HADADI ROAD , DAVANAGERE",22 Jul 2026,DVG00198ALH1A +Allopathy,Hospital (Level 1A),SUMATH HOSPITAL,BESIDE LMC PHARMA HUMANABAD RING ROAD KALABURAGI,01 Jan 2026,GLB00108ALH1A +Allopathy,Clinic/Polyclinic with Observation,NLBC Clinic,"Vandana Arcade,2nd Floor, 8th B 27th Cross, Jayanagar 4th Block, Bengaluru-11",12 Nov 2025,BLU01118ALCWO +Ayurveda,Clinic/Polyclinic with Dispensary,CHIRAAYU AYURVEDA,"SURESH COMPLEX, SHEDIGURI,, NARIKOMBU, BANTWAL",09 Nov 2025,DKA00085AYCWD +Allopathy,Hospital (Level 2),KANABUR HOSPITAL,"Sector No 34, Plot No 58E Near Ambedkar Bhavan Navanagar Bagalkot",21 Dec 2025,BGK00056ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,Patil Clinic,"Panchayat Road, Waderhatti",28 Feb 2026,BLG00182AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,OM SHRI DEVI CLINIC,KAKATNUR TQ.ATHANI DT.BELAGAVI,19 Mar 2026,BLG00254AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,shreeshaila Clinic,Venkateshwara Temple Road Kudligi,16 Apr 2026,BEL00161AYCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,PRANAVA DIAGNOSTIC AND LABORATORY,"NO.2265, 9TH MAIN ROAD, 22ND CROSS, BSK 2ND STAGE, BANGALORE-560070.",23 Sep 2025,BLU00731ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,GURUSHAKTI CLINIC,NEAR KSRTC BUS STAND HUNASAGI,01 Feb 2026,YDR00023AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Rajashree Clinic,"23, Satyanarayana Temple Street, Bangalore -560008",21 Nov 2026,BLU02621ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Sindhoora Clinic,Kalleri - 574326,18 Mar 2026,DKA00298AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,KAVITA MEMORIAL CLINIC,"Shop No.4, Shettar Oni, Ganeshpeth Main Road, Hubballi.",21 Dec 2026,DWR00416ALCOC +Allopathy,Hospital (Level 1A),GURUNANAK LIFE LINE HOSIPTAL,NEAR INDI ROAD BUS STOP VIJAYAPUR,30 Jan 2026,BIJ00159ALH1A +Allopathy,Hospital (Level 1A),V G HOSPITAL Center for Endoscopy and Laparoscopy,"CTS no.3388, Ground Floor 'AVOUMBAR CHAYA', Gondali Galli, Belgaum",10 Nov 2025,BLG00038ALH1A +Allopathy,Hospital (Level 2),KANVA HOSPITALL,"NARAYANI COMPLEX, NEAR GANDHI CHOWK, RAICHUR",13 May 2026,RCR00025ALHL2 +Homeopathy,Clinic/Polyclinic with Dispensary,SHASTRIS CLINIC,"17-7-464/4, BELVUE APTS. VALENCIA CIRCLE, MANGALORE",17 Aug 2026,DKA00549HOCWD +Ayurveda,Clinic/Polyclinic with Dispensary,SHRI DEVI CLINIC PUTTUR,"BETTAMPADY, PUTTUR",28 Dec 2025,DKA00177AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,SKIN CLINIC KADRI MANGALORE,"JAYAVERMA CENTER +MALLIKATTE KADRI MANGALURU",09 Nov 2025,DKA00081ALCOC +Allopathy,Hospital (Level 1A),Vikram Diagnostic and Hospital,"#3 ,Pragathi Nagar,Chikkathoguru main road, Electronic city, Bangalore",15 Sep 2025,BLU00684ALH1A +Ayurveda,Clinic/Polyclinic with Dispensary,Dr.Govinda Prasad Kaje,"Sanjeevini clinic +LAXMI complex +Uppinangady.",21 Dec 2025,DKA00174AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,DHANVANTRI CLINIC,"MAIN ROAD, MURGOD.",25 May 2025,BLG00001ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,Anugraha clinic,Main road venur belthangady,18 Mar 2026,DKA00314ALCOC +Ayurveda,Allied Health Professional Centre,Shreepoorna Ayurveda Panchakarma Chikitsalaya,"Palecharu,Post and Village Ballya,",28 Dec 2025,DKA00180AYAHC +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE SANGAMESHWAR CLINIC,TAKKALAKI RC BAGALKOT ROAD BILAGI,07 Jun 2027,BGK00353AYCWD +Allopathy,Dental Lab or Clinic,Sanjivini Devi Clinic,"2/269, Sanjivini Devi Clinic, Bajpe",06 Jan 2026,DKA00187ALDEN +Allopathy,Hospital (Level 2),ATHREYA HOSPITAL,"NO.6/2B, OPPSITE SURYANAGAR, PHASE-1, CHANDAPURA, ANEKAL MAIN ROAD, BANGALORE-560099.",04 Jun 2025,BLU00270ALHL2 +Allopathy,Hospital (Level 1A),Private,MATHA NURSING HOME BANDHI GOWDA LAYOUT 2nd CROSS MANDYA,19 Jan 2026,MAN00034ALH1A +Ayurveda,Clinic/Polyclinic with Dispensary,SRI PADMAMBA CHIKITSALAYA,"Jail Road, Opp. to Sristi Clinic, Shimoga.",17 Dec 2028,SMG00495AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,SUSHRUTHA CHILDRENS CLINIC,"sushrutha children'c clinic.[vijaya medical's bld], I.G. road road.chikmagalur.",22 Nov 2026,CKM00070ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,MALLIGE CHILD CARE CLINIC,"NO.3,7TH MAIN,1ST F CROSS,RPC LAYOUT,OPP.MARUTHI MEDICALS,NEAR BUNTS SANGHA,VIJAYANGAR,BANGALORE",06 Aug 2025,BLU00490ALCDS +Allopathy,Clinic/Polyclinic with Observation,DIVYADRISHTI EYE HOSPITAL,"NO 1108/K, NEW NO 8,9TH C MAIN,RPC LAYOUT,HAMPINAGARA,VIJAYANAGARABANGALORE",23 Aug 2026,BLU02238ALCWO +Allopathy,Hospital (Level 1A),Vedanth Hospital,"2 nd cross, Geetha Road, Robertsonpet, kgf",12 Aug 2026,KLR00034ALH1A +Homeopathy,Clinic/Polyclinic with Dispensary,G B MATHA CLINIC,MIRJI COMPLEX B B ROAD SHAHAPUR,28 May 2026,YDR00095HOCWD +Allopathy,Hospital (Level 1B),MAATHOSHREE WOMENS HOSPITAL,"Prabhat Colony, Vidyanagar, Hubballi.",07 Apr 2026,DWR00229ALH1B +Ayurveda,AYUSH Therapy Centre,CHIRAYU AYURVEDIC MULTISPECIALITY CENTRE,"TOP FLOOR,BIRADAR EYE HOSPITAL GODBOLE MALA, MEENAXI CHOWK VIJAYAPUR.",30 Jan 2026,BIJ00155AYATC +Ayurveda,Clinic/Polyclinic Only Consultation,PAUL CLINIC,"DN 932, 1ST MAIN, 2ND CROSS, K B EXTENSION DAVANGERE 577002",08 Oct 2025,DVG00069AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,HAJIRA ENT CLINIC,"Tabib Mansion, Below Karnataka Bank, Fort Road, CBT, Hubballi.",19 Oct 2025,DWR00089ALCOC +Allopathy,Medical Diagnostic Laboratory,MARUTHI DIAGNOSTIC,"G M ARCADE, YEYYADI, MANGALORE.",01 Mar 2027,DKA00665ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,Manvitha Neuropsychiatry Center,"No.705, Ground floor, Om Shree MNV Towers, HMT Layout 4th Block, Vidhyaranyapura, Bangalore",07 Dec 2026,BLU02715ALCOC +Siddha,Clinic/Polyclinic Only Consultation,DIVISION OF SIDDA CENTER FOR INTEGRATIVE MEDICINE AND RESEARCH,"DR. RAMDAS M PAI, A UNIT OF MAHE, MANIPAL",26 Jan 2026,UDP00070SICOC +Allopathy,Hospital (Level 2),Dr. Vijays Health Care,"Mysore Malavalli Main Road, Santhemala, Bannur",01 Feb 2026,MYS00047ALHL2 +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE RAMA CHIKITSALAYA,"KOTEKAR POST, BEERI, MANGALORE",17 Aug 2026,DKA00545AYCWD +Allopathy,Medical Diagnostic Laboratory,RELIABLE HITECH DIAGNOSTICS,"No.10, Rayasandra Circle, Behind Vishnu Grand Hotel, Naganathapura, Bangalore",16 Aug 2025,BLU00535ALMDL +Allopathy,Medical Diagnostic Laboratory,VISION DIAGNOSTICS,"NO. 44, Pipeline Main Road, Vijayanagar, Bangalore 560040",25 Aug 2025,BLU00569ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,SEETA CLINIC,"#192/A, Thyavanige, Channagiri Taluk, Davanagere District",01 Jul 2027,DVG00363ALCOC +Allopathy,Diagnostic Imaging Centre,SWARNAMBA X RAY & ULTRASOUND SCANNING CENTER,OPP HOTEL APOORVA PARK ROAD HASSAN,25 Aug 2026,HSN00054ALDIC +Allopathy,Dental Lab or Clinic,The Right Bite Craniofacial Pain Care LLP,"825, 1st Floor, Municipal No. 42, 13th Cross, W.K.P Road, 7th Block, Jayanagar, Bangalore",17 Sep 2025,BLU00693ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,Dr Akshays Maxillofacial and Implant Centre,"""AKSHAYA"", No. 1338, AECS LAYOUT, D Block 60 feet road, Kundalahalli, Bangalore",12 Oct 2025,BLU00823ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,AYUSH CLINIC AND WELLNESS CENTER,"81, 12TH CROSS, VIRUPAKSHAPURA, KODIGEHALLI,",22 May 2028,BLU04705ALCOC +Allopathy,Clinic/Polyclinic with Observation,K.V.SHIVAPRAKASH CLINIC,"#2158/173, Marenahalli Road, Jagaluru-577528, Davanagere District",19 Sep 2025,DVG00046ALCWO +Allopathy,Clinic/Polyclinic with Observation,Dr.AGARWALS EYE HOSPITAL,"SAMARTH Arcade, CTS No 96B/1A, PB Road, Opp to Jubilee Circle BRTS Bus station, PB Road, Dharwad-580001",19 Sep 2025,DWR00022ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,VIJAYA CLINIC,"Tilaknagar Main Road, +Besides Vivekananda Hospital, +Shimoga Tq.",18 Apr 2026,SMG00039ALCOC +Allopathy,Clinic/Polyclinic with Dispensary,SANTRUPTH MEDICAL CENTER,"TOLLNAKA, P.B.ROAD,NEXT TO KARISHMA RESIDENCY, DHARWAD-580004.",28 Aug 2025,DWR00017ALCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,SRI HANUMAN PLUS POLY CLINIC,"B.K.SIDDAPPA BADAVANE, BALAJI NAGAR, SIRA TOWN, SIRA TALUK, TUMKUR DISTRICT",18 Feb 2026,TMK00108ALCDS +Allopathy,Clinic/Polyclinic with Dispensary,VISHWAAS CLINIC,"VIDYANAGAR, PANJIMOGARU",05 Nov 2025,DKA00073ALCWD +Ayurveda,Clinic/Polyclinic Only Consultation,GARDEN VIEW HEALTH CENER,GARDEN VIEW HEALTH CENTER PANAJE POST PUTTUR TALUK DAKSHINA KANNADA,28 Dec 2025,DKA00183AYCOC +Allopathy,Dental Lab or Clinic,Dr. Nehas Dental Clinic,"96, BEML nagar main road, LIC colony, Srirampura 2nd stage",26 May 2027,MYS00507ALDEN +Allopathy,Hospital (Level 1B),Shri Banashankari Child Care Center,"Plot NO 35,36,NARS NO 797/1A,1st cross, Rajarajeshwari nagar, Ranebennur",15 Feb 2026,HVR00112ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,VIJAYALAKSHMI CLINIC,"NO 12 , 5TH ' A 'CROSS , 3RD BLOCK , NANDINI LAYOUT , BANGALORE",14 Dec 2028,BLU06143AYCOC +Allopathy,Hospital (Level 1A),JANANI NURSING HOME,JANANI NURSING HOME MULAGUND ROAD OPP J C SCHOOL GADAG,12 Jul 2025,GDG00001ALH1A +Allopathy,Dental Lab or Clinic,Ruttonjis Dental clinic and Implant Centre,"Ho no 14,15church street Camp",20 Nov 2029,BLG02594ALDEN +Allopathy,Dental Lab or Clinic,DENTACARE MULTISPECIALITY CLINIC,"BESIDE SBI, SHARADA HOMES BUILDING, SAPTAPUR DHARWAD",08 Oct 2027,DWR00509ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,ICONIC SUPERSPECIALITY POLYCLINIC,"NIRMALA ARCADE, 2ND FLOOR, NEXT TO HDFC BANK, R.T.NAGAR MAIN ROAD,",02 Aug 2025,BLU00466ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Ganesh poly Clinic,"#107 ,18th main, Pipeline Road J.C Nagar +Kurubarahalli Bangalore - 560086",26 Aug 2026,BLU02294AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,MATHAPATI HOSPITAL,VB TEMPLE ROAD NEAR BASAVESHWAR CIRCLE HUMNABAD,07 Feb 2026,BDR00026AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,ABHAY CHILD CARE CENTRE,"Nethravathi Building, First Floor, Balmatta, Mangalore",09 Oct 2025,DKA00030ALCOC +Allopathy,Clinic/Polyclinic with Observation,GEJJES MARVELLA,"Ground Floor, Door No-657, Near Sri Raghavendra Math, Gandhi Colony, Hospet.",15 Aug 2026,BEL00226ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,OMKAR CHILD CARE,KHED COLLEGE CROSS LINGAD GUDI ROAD VIJAYAPUR,03 Nov 2025,BIJ00124ALCOC +Ayurveda,Clinic/Polyclinic with Diagnostic Support,KOUSHIK CLINIC,"Hoohakuvakallu, Balepuni post,Mudipu, Bantval TQ",09 Oct 2025,DKA00033AYCDS +Allopathy,Dental Lab or Clinic,ullal multispeciality dental clinic,"shop no G11, next to daily freshsupermarket, inland impala building ,ullal mangalore",09 Oct 2025,DKA00034ALDEN +Allopathy,Diagnostic Imaging Centre,SWATHI DIAGNOSTIC CENTRE,"FIRST FLOOR, SDR PLAZA, RAM MANDIR CROSS ROAD, OPPOSITE CHOTULAL SWEETS, VIJAYAPURA",27 Jul 2025,BIJ00101ALDIC +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE SUKHAYU AYURVEDA KENDRA KOTTAKAL ARYA VAIDYASALA,"#19/97, 20th Main, 2nd Block, Near Citi Hospital, West Of Chord Road, Rajajinagar, Bangalore",01 Feb 2028,BLU04206AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,DHANVANTRI CLINIC,11TH WARD KARANAM STREET KAMALAPURA PO HOSPET TQ,12 Jul 2027,VIJ00034AYCOC +Allopathy,Health Check-up Centre,AJIMSRHTC,"Melkar, Karnataka 574231",20 Nov 2025,DKA00160ALHCC +Allopathy,Clinic/Polyclinic Only Consultation,SARASWATHI CLINIC,"DR A SARASWATHAMMA, DOOR NO 22/168, BRAMARAMBHA FIRST CROSS, CHAMARAJANAGARA POST AND DIST",09 Jul 2026,CNR00004ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SKIN CLINIC,"SKIN CLINIC, AMBAGILU, UPPUNDA, KUNDAPURA , UDUPI",26 Oct 2025,UDP00010ALCOC +Allopathy,Medical Diagnostic Laboratory,DNA DIAGNOSTICS,NO 3 BESIDE SRI MATHA CLINIC D CROSS DODDABALLAPUR BANGALORE RURAL,02 Aug 2026,BLR00030ALMDL +Allopathy,Hospital (Level 1A),KANGAROO CARE,"A UNIT OF SURABHI MYSORE HEALTHCARE AND RESEARCH PVT LTD, #505, KALIDASA ROAD, 1ST STAGE, VIJAYANAGAR, MYSORE- 570017",28 Jan 2026,MYS00007ALH1A +Allopathy,Clinic/Polyclinic with Dispensary,M.D.MOORTHY CLINIC,"NEAR OOREGAUMPET POLICE STATION +OPP DR AMBEDKAR STATUE KGF",27 Jun 2028,KLR00246ALCWD +Ayurveda,Clinic/Polyclinic Only Consultation,Aarna Health Care,"Aarna Health care, 1st floor, Odyssey complex, IB road, Kushalnagar",23 Jun 2026,KDG00018AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,DEVIKA CLINIC,"DR AMBEDKAR ROAD, BEHIND CHANDRA MEDICAL, 1ST FLOOR , KOLLEGAL TOWN",10 Feb 2030,CNR00126ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,NEELAMBIKA CLINIC,NEAR MARAGAMMA TEMPLE BHAJANTRI GALLI IBRAHIMPUR VIJAYAPUR,31 Jul 2026,BIJ00226AYCOC +12345678910...,1,2,3,4,5 +Allopathy,Hospital (Level 2),suresh hospital and maternity home,"opp mohan theatre, +hegganahalli main road +bangalore91",15 Oct 2025,BLU00840ALHL2 +Allopathy,Hospital (Level 1A),M/s. Sri Deepa Hospital.,"#644, 60 ft Road,5th Block,Vishweshwaraiah Nagar, Naer Ullal Upanagar, Bengaluru-560056",01 Nov 2025,BLU00897ALH1A +Ayurveda,AYUSH Therapy Centre,ARAVINDs AYURVEDA WELLNESS CENTRE,"1st Parallel Road, Durgigudi, Near Sparsha Hospital, Shimoga.",09 Jun 2026,SMG00054AYATC +Homeopathy,Clinic/Polyclinic with Dispensary,LIFE LINE HOMOEOPATHY,"BASEMENT, ESSEL CENTRE, M.G ROAD, MANGALORE",26 Jan 2026,DKA00258HOCWD +Allopathy,Hospital (Level 1A),D R M HOSPITAL,BEHIND OLD INDIAN BANK HOLALKERE ROAD CHITRADURGA,03 Feb 2026,CTR00016ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,THE EYE CLINIC,"ANNAIAH COMPLEX +HOSALLI ROAD, MANDYA",19 Feb 2026,MAN00071ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SANJEEVINI CLINIC,"No.85, Srigandhanagar, 3rd Cross, Hegganahalli Main Road, Bangalore",27 Oct 2025,BLU00871AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,LAKSHMI CHILD CLINIC,"BEHIND BHAVANI TILES +NEAR BALAMURGAN TEMPLE +CORONATION RAOD +BANGARPET",28 Feb 2027,KLR00126ALCOC +Allopathy,Medical Diagnostic Laboratory,ADITI CLINICAL LABORATORY,"CHAITRARAVI, 2ND CROSS KANAKA NAGARA NH 13 CHITRADURGA",07 Feb 2026,CTR00029ALMDL +Allopathy,Hospital (Level 1A),MEDIVISION HOSPITALS,"NO.20 AND 21, 1ST CROSS, RAMANJANEYA LAYOUT, RING ROAD, MARATHALLI, BANGALORE-560037.",28 Oct 2025,BLU00885ALH1A +Allopathy,Dental Lab or Clinic,SURAKSHA SPECIALITY DENTAL CARE,"1ST FLOOR T.M.P PLAZA, BESIDE MORE SUPER MARKET, S.N PET MAIN ROAD, BALLARI",16 Apr 2026,BEL00163ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,GIRISH CHILDREN CLINIC/ VOLGA DENTAL CLINIC,"NO.793, 8TH A CROSS, A SECTOR, YELAHANKA NEW TOWN, BANGALORE-560064.",09 Oct 2025,BLU00798ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,INDIRA HEALTH CARE,SUYOGA NILAYA NEAR GOVT PRIMARY SCHOOL JOGIMATTI MAIN ROAD CHITRADURGA,03 Aug 2026,CTR00116ALCDS +Allopathy,Clinic/Polyclinic with Dispensary,Rukmini Poly Clinic,LIC colony sonarwada Baad Karwar,20 Sep 2026,UKA00046ALCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,MARUTHI DIAGNOSTICS,"NO.329, 4TH BLOCK, 3RD STAGE, NEXT TO YES BANK, NEAR PANACEA HOSPITAL, BASAVESHWARANAGAR, BANGALORE-560079",29 Jul 2026,BLU02127ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,KUSUMA CLINIC,"SHAH HUSSAIN CHILLA, BRAHMAPUR, KALABURAGI",04 Aug 2026,GLB00290ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,The Family Doctor A Unit of Modern Family Doctor Private Limited,"No 934/919/904, Sattva Greenage Apartment, Juniper Block, Ground Floor, Hosur Road, Bommanahalli, Bangalore - 560068",07 Sep 2026,BLU02323ALCDS +Ayurveda,AYUSH Therapy Centre,PRAJNA KUTEERA AYURVEDA CENTRE,"434, 'MELODY', VISHWAMANAVA DOUBLE ROAD , KUVEMPUNAGAR, MYSORE",01 Jul 2027,MYS00573AYATC +Ayurveda,Clinic/Polyclinic Only Consultation,Krishna Clinic,"Hemmargala Village, Nanjangud Taluk.",07 Jul 2027,MYS00596AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Maruthi Clinic,No.242/2 Madura Garments Road Parappanaagrahara Electronic City Bengaluru,03 Aug 2026,BLU02156AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Shree Annadani Clinic,No.180/2 Near Bus Stop Hosur Main Road Singasandra Bengaluru,03 Aug 2026,BLU02157AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Nimishamba Ayur Clinic,"#967, 7th Main, 1st Stage, Hebbal, Mysore.",07 Jul 2027,MYS00609AYCOC +Allopathy,Medical Diagnostic Laboratory,RAAGHU DIAGNOSTIC LABORATORY,"GURU SHREE, 1ST CROSS, CSI LAYOUT , BEHIND GAYATHRI TALKIES AND MALABAR GOLD SHOP, B.H.ROAD, TUMAKURU-572102",29 Jul 2026,TMK00189ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,Akshay Clinic,EETI Complex Madalagatta Circle Huvinahadagali,22 Nov 2026,BEL00278AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR.SOWMYAS CHILD CARE CLINIC,"No.11, Muddinapalya Main Road, BEL Layout, 1st Stage, Magadi Road, Bangalore - 560091",13 Jul 2026,BLU02098ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Ashwini Health Centre,No.88/1 Chikka Begur Gate 7th Mile Hosur Road Bengaluru,18 Aug 2026,BLU02221AYCOC +Allopathy,Dental Lab or Clinic,SPECIALITY DENTAL CLINIC,"1ST FLOOR ESSEL CHAMBERS, OPP. MEDICARE CENTRE, KARANGALPADY, MANGALORE",12 Dec 2026,DKA00612ALDEN +Ayurveda,Hospital (Level 4)(Teaching),SGESS DR. N. A. MAGADUM AYURVEDIC MEDICAL COLLEGE HOSPITAL RESEARCH CENTRE ANKALI.,A/p Ankali Taluk Chikodi District Belagavi,01 Oct 2026,BLG00430AYHL4 +Allopathy,Dental Lab or Clinic,SHREE DURGA DENTAL CLINIC,IB ROAD KUSHALNAGARA,26 Jun 2027,KDG00078ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,ENT CLINIC,"ENT CLINIC, RAAG LALITH BUILDING, K.M. MARG, UDUPI",28 Nov 2026,UDP00469ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SHANKARA RETINA CARE,NITTUVALLI ROAD SAYSAM LAYOUT SIDDESHWARA MILL COMPOUND,30 Mar 2027,DVG00291ALCOC +Integrated System,Clinic/Polyclinic with Dispensary,Shanthi Clinic,"9th Cross, T.K.Layout, Mysore.",07 Jul 2027,MYS00607ISCWD +Ayurveda,Clinic/Polyclinic with Dispensary,Sneha clinic,"Sneha clinic. Hura +NANJANGUD taluk",01 Nov 2027,MYS00711AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,AMARA SKIN CLINIC,"No.1065/a12, 2nd Floor, 9th Main, Devarachikkanahalli, Bangalore - 560076",11 Jul 2026,BLU02089ALCOC +Allopathy,Medical Diagnostic Laboratory,Medlife Diagnostic centre,"1-26/10, T S Complex, K C Nagar, K C Road, Talapady Post",01 Aug 2026,DKA00504ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,RAVI CLINIC,"NO.45/1, NGOS COLONY, KAMALA NAGAR, BANGALORE-560079.",23 Aug 2026,BLU02272AYCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,LIFE INN HEALTHCARE AND DIAGNOSTIC,"4M-409, Govinda Narayani Plaza, East of NGEF Layout, Dooravani Nagar, Near Airtel Office, Ramamurthy Nagar, Bangalore - 560016",11 Jul 2026,BLU02088ALCDS +Allopathy,Dental Lab or Clinic,Align & Smile Orthodontic & Multispeciality Dental Clinic,"No 31/1A1, ekam boutique +Behind star market ,Balagere main road +Balagere , Panathur ,Bangalore 560087",07 Sep 2026,BLU02321ALDEN +Ayurveda,Clinic/Polyclinic Only Consultation,SRI RANGANATHA CLINIC,"Post Office Road, Srirampura, Hosadurga Taluk 577542 Chitradurga District",03 Aug 2026,CTR00114AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,MONA CLINIC & LAB,"Ward Office Road, E Block 2nd Stage, Rajajinagar",13 Jul 2028,BLU05010ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHRI GURU CLINIC,SHIVAJI CIRCLE MUDHOL DIST BAGALKOT,03 Oct 2026,BGK00163AYCOC +Allopathy,Hospital (Level 1B),H D BAGWAN MEMORIAL CHILDREN HOSPITAL,"BEHIND CENTRAL BUS STAND, SAQAF ROZA ROAD, VIJAYPUR",19 Aug 2026,BIJ00231ALH1B +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,196/C DON COMPLEX TRASI POST KUNDAPURA TALUK,28 Nov 2026,UDP00448AYCWD +Allopathy,Hospital (Level 2),SAGAR NURSING HOME AND LASER CENTER,"NEAR JAIL CIRCLE, 1ST CROSS, ACHUTH RAO LAYOUT SHIVAMOGGA - 577 201.",23 Dec 2026,SMG00130ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Mahadeshwara Clinic,"Kolipalya Village, Mukan palya Post, Chamarajanagar Taluk DIst",15 Aug 2026,CNR00019AYCOC +Allopathy,Dental Lab or Clinic,VIDYANAGAR DENTAL CLINIC,"VIDYANAGAR, BH ROAD, SHIVAMOGGA.",23 Dec 2026,SMG00134ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,KIRAN DIAGNOSTIC & CONSULTATION CENTRE,NEAR DISTRICT HOSPITAL TURUVANUR ROAD CHITRADURGA,03 Aug 2026,CTR00109ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,Hawaldar Clinic,"Timmapur,Shiggaon,Haveri,581205",18 Aug 2026,HVR00197AYCOC +Allopathy,Clinic/Polyclinic with Observation,Vaxiassist Health Initiatives Pvt Ltd,"#18/2A, 1st floor, Ambalipura, Sarjapur main road, Bellandur gate, Bengaluru",28 Nov 2026,BLU02645ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,MANGALORE CLINIC,"#-59-20, Ghalib Street, +Lashkar Mohalla, Near Govt. School, Shimoga",23 Nov 2026,SMG00085ALCOC +Allopathy,Hospital (Level 2),VAM HOSPITAL,"OOTY-MYSORE ROAD, GUDNLUPET TOWN CHAMARAJANAGAR DISTRICT",13 Jul 2027,CNR00045ALHL2 +Allopathy,Clinic/Polyclinic with Observation,DIVYA SKIN COSMODERM LASER CLINIC,"SHOP NO 12, WARD NO 20, T G LAYOUT, MOKA ROAD, GANDHI NAGAR",13 Jun 2027,BEL00347ALCWO +Allopathy,Hospital (Level 2),SHARADA HOSPITAL,SHARADA HOSPITAL OPP CORPORATION BANK PARAMANNA LAYOUT NELAMANGALA BANGALORE,12 Aug 2026,BLR00037ALHL2 +Allopathy,Medical Diagnostic Laboratory,JEEVAN DIAGNOSTIC LABORATORY,"Shop No 2, Opp Old Remand Home, Siruguppa Road",04 Jan 2027,BEL00302ALMDL +Allopathy,Hospital (Level 1B),Ganga nursing home,"Ganga nursing home ,cts no -190/1a ,plot no 1 and 2",08 Jun 2026,BLG00296ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,SUSHANTH CLINIC,OPP PRABHAT THEATER GANESH TEMPLE STREET,22 May 2028,BEL00476ALCOC +Homeopathy,Clinic/Polyclinic with Dispensary,Ashwini Homeo Clinic,"1622, 5th B Cross, 17 Main, BSK 1st Stage, 2nd Block, Hanumant Nagar, Mysore Bank Colony, Phase 1, Banashankari Stage I, Banashankari, Bengaluru, Karn",04 Aug 2029,BLU08380HOCWD +Integrated System,Clinic/Polyclinic Only Consultation,Ashwini Family Clinic,"#61/2, 6th Cross, S.P Extension, Malleshwaram",03 May 2026,BLU01883ISCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Adarsh Clinic,"C/O Nagesh Naik, +Near HPS Vannalli, +Vannalli, Kumta",20 Sep 2026,UKA00048AYCWD +Allopathy,Hospital (Level 1A),RAJALAKSHMI MULTISPECIALITY HOSPITAL A UNIT OF SAMMPRASA MEDCARE PVT LTD,"NO.76-1-1, V.R.LAYOUT, SARAKKI MAIN ROAD, 1ST PHASE, J.P.NAGAR, BANGALORE-560078.",03 Mar 2026,BLU01592ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,Amba Clinic,"Kadle Beedi, Arsikere, Hassan District-573103",13 Jun 2027,HSN00193AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,AMOGA DENTAL STUDIO,"#28,PRASHANTH LAYOUT MAIN ROAD,WHITEFIELD BANGALORE - 560066",04 Mar 2026,BLU01615ALCOC +Allopathy,Clinic/Polyclinic with Dispensary,SRI GURU CLINIC,"BADAR COMPLEX,BAVIKATTE,GUJJADI,KUNDAPURA TALUK",24 Jun 2026,UDP00162ALCWD +Allopathy,Medical Diagnostic Laboratory,ARCHANA DIAGNOSTIC LABORATORY AND XRAY,"COMMING ROAD, NEAR NEELAKANTESHWARA SWAMY TEMPLE, BIG VEGETABLE MARKET, BALLARI",13 Jun 2027,BEL00342ALMDL +Allopathy,Clinic/Polyclinic with Observation,HOPEWELL MULTISPECIALITY CLINIC,"S K MALPE, 2ND FLOOR, SY.NO 29/1, BELATHUR, KADUGODI POST, BANGALORE-560067",28 Feb 2026,BLU01571ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,SKIN CARE CLINIC,"1530/B 1ST FLOOR OMKAR BUILDING, MARUTI GALLI, BELAGAVI-590001 TQ/DT-BELAGAVI",24 Aug 2026,BLG00390ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SPARSH CLINIC,"Jai Bheem Nagar Road, Bhusappa Chowk, Dharwad.",11 Sep 2026,DWR00359HOCOC +Allopathy,Hospital (Level 1B),ISHAAN CHILDRENS HOSPITAL,"SY NO 310 311 PLOT NO A5/5, 142 143 OPP BDA OFFICE VIVEK NAGAR WEST BAGALKOT ROAD VIJAYAPUR",30 Oct 2026,BIJ00290ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,SRI GURU THIPPERUDHRA SWAMY CLINIC,"DOOR NO 1 WARD NO. 2, LAKSHMINAGAR, NEAR OLD BUSSTAND, MOKA, BALLARI TALUK and DISTRICT",24 Oct 2027,BEL00389AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,L K CLINIC,"#-3, Raghavendra Complex, +S.S.Road, Near Sridhar Nursing Home, Shiralakoppa, Shikaripura.",23 Nov 2026,SMG00086AYCOC +Allopathy,Hospital (Level 1A),MANA PARIVARTHANA SEVA TRUST,"Minnapura Village T.Beguru, Near Siddaratha Hospital, Jakkanahalli Hoblli Nelamangala",30 Sep 2026,BLR00050ALH1A +Allopathy,Clinic/Polyclinic with Observation,PATIL CLINIC INDI,"Shankar Parvati Complex, Ground Floor, Vijayapur Road, INDI",29 Sep 2026,BIJ00266ALCWO +Ayurveda,Clinic/Polyclinic with Dispensary,Kochikars Clinic,"Kochikars Clinic, K.M.Marg,Udupi.",01 Mar 2027,UDP00576AYCWD +Homeopathy,Clinic/Polyclinic Only Consultation,MARIYAM CLINIC,"H. NO. 20, HIGH STREET, CAMP, BELAGAVI",24 Aug 2026,BLG00391HOCOC +Allopathy,Clinic/Polyclinic with Dispensary,PRAMOD CLINIC AND SKIN CARE CENTRE,"# 454/5, B.T.Road, Hinkal",14 Jun 2027,MYS00557ALCWD +Allopathy,Medical Diagnostic Laboratory,CANARA CLINICAL LAB,1ST FLOOR BARNES TOWERS NEAR BUS STAND BRAHMAVARA,19 May 2027,UDP00726ALMDL +Allopathy,Hospital (Level 1B),SHRI SANGAMESHWAR HOSPITAL,"SONATA PRIME CITY NH-13, OPP NARAYAN HYUNDAI VIJAYAPUR",30 Oct 2026,BIJ00297ALH1B +Allopathy,Clinic/Polyclinic with Diagnostic Support,WAVES SCAN AND DIAGNOSTICS CENTRE,"NO.1585/1, 1ST MAIN ROAD, CHANDRA LAYOUT, VIJAYANAGAR, BANGALORE-560040.",07 Sep 2026,BLU02331ALCDS +Allopathy,Diagnostic Imaging Centre,MEDISCAN DIAGNOSTIC CARE,"BEHIND G K COMPLEX,OPP MOHAN LODGE, MSK MILL ROAD, KALABURAGI-585102.",11 Oct 2026,GLB00346ALDIC +Allopathy,Clinic/Polyclinic Only Consultation,WATWE CLINIC,NEAR TAJ BAVADI VIJAYAPURA,30 Oct 2026,BIJ00293ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,CITY CLINIC,"CITY CLINIC, MALLESHWARA CIRCLE, KADUR",17 Nov 2026,CKM00056AYCOC +Unani,Clinic/Polyclinic with Diagnostic Support,AL SABA CLINIC AND DIAGNOSTIC CENTRE,"Opp Sapthagiri indian oil petrol bunk, T. K. Main Road -Hebbur.",06 Oct 2026,TMK00254UNCDS +Allopathy,Clinic/Polyclinic Only Consultation,SHRI KAMAKSHI CLINIC,2ND CROSS DEVKI DATT BUILDING SHASTRI NAGAR BELAGAVI-590003 TQ/DT-BELAGAVI,24 Aug 2026,BLG00393ALCOC +Allopathy,Hospital (Level 3)(Non-Teaching with Super Specialty Services),NEUROBHARAT BRAIN SPINE AND TRAUMA HOSPITAL,"Deenadayal Upadhya road, Mission compound",28 Mar 2027,SMG00168ALHL3 +Ayurveda,Clinic/Polyclinic Only Consultation,MAHANTESHWARI CLINIC,"2-6-72, C.B TEMPLE ROAD, SHAHAPUR",01 Sep 2026,YDR00111AYCOC +Allopathy,Hospital (Level 1A),SOFI HOSPITAL,SHRI MONAPPA BADIGER SHOP NO.21 OPP OLD SBI BANK BIJAPUR ROAD JEWARGI DIST.KALABURAGI-585310,12 Sep 2026,GLB00327ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,SRI RAGHAVENDRA CLINIC,"# 2207, BASAVESHWARA ROAD, MYSORE",26 May 2027,MYS00508ALCOC +Allopathy,Hospital (Level 1A),SURYA HOSPITAL,OPPOSITE GENERAL HOSPITAL NH206 KADUR,17 Nov 2026,CKM00060ALH1A +Allopathy,Clinic/Polyclinic with Diagnostic Support,Kshema Health Care,"Beside KEB , Opposite to Police Guest House, Mulgund Naka, Gadag",26 Sep 2026,GDG00044ALCDS +Ayurveda,AYUSH Therapy Centre,Shree Veerabhadreshwara Ayurvedic Hospital,"Shree Veerabhadreshwara Ayurvedic Hospital Panchakarma chikitsa kendra, Tippusultan nagar, Badami Dist-Bagalkot",19 Sep 2027,BGK00480AYATC +Allopathy,Diagnostic Imaging Centre,Athani Diagnostic Centre,CTS No 1222 Haliyal Road,30 Jun 2026,BLG00302ALDIC +Ayurveda,Clinic/Polyclinic Only Consultation,R K CLINIC,"Anna Complex Opp to KSRTC Bus Stand H B Road, H D Kote, Mysore District",09 May 2027,MYS00414AYCOC +Allopathy,Dental Lab or Clinic,Mysore Dental Clinic,145/B first floor Devaraj Urs Road,12 Jun 2027,MYS00552ALDEN +Allopathy,Hospital (Level 1A),Lifecare hospital,"Boodikere, Kanakapura town",12 May 2027,RMG00084ALH1A +Allopathy,Hospital (Level 1B),PRALAKSHA HOSPITAL,"# 275/1, VEDA ARCADE, HUNSUR MAIN ROAD, HOOTAGALLY, MYSORE",14 Jun 2026,MYS00107ALH1B +Allopathy,Hospital (Level 1A),Dr O GRADY HEALTH CENTRE AND MATERNITY HOME,"'JYOTHI NILAYA' Main Road, Whitefield",19 Nov 2026,BLU02609ALH1A +Allopathy,Specialty / Super-Specialty Specific Hospital,YASHODA INSTITUTE OF MEDICAL SCIENCE AND RESEARCH CENTRE VIJAYAPUR,"107/2B VIJAYAPUR -SOLAPUR BYPASS JUNCTION, NH13 BHUTANAL VIJAYAPUR",12 Jul 2026,BIJ00213ALSSH +Ayurveda,Clinic/Polyclinic with Dispensary,Sanjeevini Clinic,Vasudha Dr. Geetha D No. 3-248/2 Airody post Mabukala Brahmavara,24 Jun 2026,UDP00161AYCWD +Allopathy,Dental Lab or Clinic,Dr. ANU DENTAL CARE,"Mendons Girija, Ananda Rao Road, Ambalpady",29 Jul 2026,UDP00205ALDEN +Allopathy,Clinic/Polyclinic with Observation,Zamindar Microsurgical Eye Centre,"1013, 1st Block, 3rd Cross, HRBR Layout, 100 Feet Banaswadi Road, Kalyan Nagar",29 Aug 2026,BLU02303ALCWO +12345678910...,1,2,3,4,5 +Homeopathy,Clinic/Polyclinic Only Consultation,SHUBHA CLINIC,"OPP. GOVT HOSPITAL, TEMPLE ROAD, BELUR",22 Mar 2027,HSN00131HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,CHILDREN CLINIC,DR RAJESHRI R ANAGOL CHILDREN CLINIC PANCHAVATI COMPLEX KONWAL GALLI SHIVAJI ROAD BELAGAVI,28 Oct 2029,BLG02590ALCOC +Allopathy,Clinic/Polyclinic with Dispensary,VOLVO GROUP INDIA PRIVATE LIMITED OCCUPATIONAL HEALTH CENTER,"Yalachahally, Tavarekere Post, Hosakote, Bangalore - 562122",11 Jul 2029,BLR00544ALCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,Anand Clinic & Diagnostic Lab,"opp New bus Stand,Behind Lic office ,Kote Road,Channarayapatna",16 Mar 2027,HSN00129ALCDS +Allopathy,Medical Diagnostic Laboratory,S.K. Diagnostic and Scan center,"NO. 163,5th Cross, RHB Colony, Mahadevapura",13 Apr 2026,BLU01806ALMDL +Allopathy,Clinic/Polyclinic with Dispensary,SPANDANA HOSPITAL,"BASAVSHWARA NAGAR, 18TH CROSS, A BLOCK, HAVERI",15 Nov 2026,HVR00245ALCWD +Allopathy,Dental Lab or Clinic,Dr. Afnas Time Two Smile Dental Lounge & Root Canal Centre,"No. 22, Novena Arcade Building, 1st Main, Brindavan Layout, Muthsandra Main Road, Sorahunase, Varthur , Bangalore",04 Mar 2026,BLU01617ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,DEEPAK CLINIC,BASAVANAGUDI BEEEDI NEAR PANCHAYATH MAHADEVAPURA SRIRANGAPATNA TQ MANDYA,30 May 2026,MAN00143AYCWD +Allopathy,Hospital (Level 2),DESAI HOSPITAL,"VIVEKANAND NAGAR, STATION ROAD,INDI- 586 209",22 Jan 2027,BIJ00366ALHL2 +Allopathy,Hospital (Level 2),KEDAR HOSPITAL,2964/1 SHASTRI NAGAR B.K.KANGRALI TQ and DT BELAGAVI,19 Mar 2026,BLG00267ALHL2 +Allopathy,Diagnostic Imaging Centre,CHIKISTA DIAGNOSTICS,BEHIND NEW TOWN POLICE STATION GURU NANAK LAYOUT BIDAR,21 Jan 2027,BDR00100ALDIC +Allopathy,Clinic/Polyclinic Only Consultation,Shree Manjunatha Kids Clinic,"#777, Opp.Vasudeva Department Store, 60Ft Main Road, M.E,L Layout, Bangalore",05 Jul 2028,BLU04986ALCOC +Allopathy,Dental Lab or Clinic,Swathi Dental Clinic,"No.101, 3rd Cross, UAS Layout, Sanjaynagar, Near NTI Bus stop, Bengaluru-560094",11 Mar 2026,BLU01652ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,MS Clinic Diagnostic and Scan Centre,"No.619 , Whitefield Main Rd, Bengaluru, Karnataka 560066",13 Jul 2026,BLU02100ALCDS +Allopathy,Medical Diagnostic Laboratory,AAROGYA DIAGNOSTIC CENTRE,"12-11-9,10,11, GARALDINNI COMPLEX, OPP SNT THEATER, LINGASGUR ROAD",15 Mar 2027,RCR00067ALMDL +Allopathy,Hospital (Level 1A),PUNIT NURSING HOME,OPP KEB P B ROAD RANEBENNUR DIST HAVERI,08 Dec 2026,HVR00255ALH1A +Allopathy,Hospital (Level 1A),SRI GAVISIDDESHWARA HOSPITAL,BAPPUR CROSS OPP HDFC BANK KUSHTAGI ROAD SINDHANUR,27 May 2026,RCR00026ALH1A +Allopathy,Medical Diagnostic Laboratory,Adarsha Clinical Laboratory,"Krishna Complex, Opp Ashwini Nursing Home, B.H.Road, Arsikere, Hassan District-573103",28 Jul 2027,HSN00206ALMDL +Allopathy,Medical Diagnostic Laboratory,STAR CLINICAL LABORATORY,"9 WARD, GUNDENKERE, HARAPANAHALLI TALUK, BALLARI",16 Apr 2026,BEL00186ALMDL +Allopathy,Hospital (Level 1B),Sampige Nursing Home,"Sampige Road, K R Puram, Hassan-573201",24 Jun 2026,HSN00044ALH1B +Allopathy,Medical Diagnostic Laboratory,LOGIC AND CLUE DIAGNOSTICS,"# 469, CHAVADI STREET M G ROAD, MYSORE -57004",15 Dec 2026,MYS00247ALMDL +Allopathy,Clinic/Polyclinic with Diagnostic Support,SRI SAI DIAGNOSTIC CENTER,"RAILWAY STATION ROAD, K R NAGAR - 571602",02 Dec 2026,MYS00221ALCDS +Allopathy,Clinic/Polyclinic with Diagnostic Support,MUSKAAN DIAGNOSTIC CENTRE,"NO.432,8TH MAIN,HRBR LAYOUT,KALYAN NAGAR,BENGALORE -560043",20 Mar 2026,BLU01672ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,RAI CLINIC,"11/2, CAMBRIDGE ROAD, OPP.CANARA BANK, HALASURU",23 Sep 2026,BLU02392ALCOC +Allopathy,Dental Lab or Clinic,Sanjeevini dental clinic,"PNM complex, behind hasanamba temple.,Hosalane road",09 Nov 2027,HSN00250ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,VANI MEMORIAL CLINIC,"Rege Building, Near Sangam Circle, Dharwad-580001",07 Apr 2026,DWR00246ALCOC +Allopathy,Clinic/Polyclinic with Observation,BHANDU DAY CARE CENTRE,"A UNIT OF DR.AV.BALIGA MEMORIAL HOSPITAL, V.M. NAGAR, DODDANAGUDDE, UDUPI",24 Jun 2026,UDP00154ALCWO +Allopathy,Clinic/Polyclinic with Dispensary,Our lady of rosary health centre,harobele,04 May 2027,RMG00069ALCWD +Ayurveda,Clinic/Polyclinic with Dispensary,ARUNA MEDICAL & SURGICAL CLINIC,MAIN ROAD MOODUBELLE,28 Nov 2026,UDP00481AYCWD +Allopathy,Dental Lab or Clinic,JANANI DENTAL CLINIC,S.N PET MAIN ROAD KEWA COMPLEX BESIDE LAKSHMI VENKATESHWARA TEMPLE,07 Sep 2026,BEL00255ALDEN +Ayurveda,Clinic/Polyclinic with Diagnostic Support,BINKADAKATTI CLINIC,BASTIBANA NEAR PUMPMA CIRLCE LAXMESHWAR,02 Jul 2026,GDG00028AYCDS +Allopathy,Clinic/Polyclinic with Dispensary,ASVINS CARE,"18/6, Kempapura Main Road, Near Neev International School, Kempapura, Marathahalli",11 Oct 2028,BLU05662ALCWD +Allopathy,Dental Lab or Clinic,HOSAMANE DENTAL CLINIC,"Singanna Complex, DG Road, Turuvekere",08 Dec 2026,TMK00269ALDEN +Allopathy,Clinic/Polyclinic with Observation,Dr. Ranjith Shetty,"Sanjeevini , Falnir, Mangalore",09 Oct 2025,DKA00021ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,Dr. Norman Mendonca,"Prime Plaza, 1st floor +Falnir",20 Jan 2026,DKA00211ALCOC +Allopathy,Clinic/Polyclinic with Dispensary,MOTHER AND HEART CARE LLP,"GROUND FLOOR 28/1, 15TH MAIN, 1ST CROSS, E BLOCK, SAHAKARA NAGAR",11 Mar 2026,BLU01638ALCWD +Allopathy,Dental Lab or Clinic,The Dentist,2nd Floor Hasan Heritage Kankanady Mangalore.,22 May 2027,DKA01002ALDEN +Allopathy,Hospital (Level 1A),M/s Utagi Hospital,Old Umarji Hospital Premises Godbole Mala Meenaxi Chowk Bijapur,28 Sep 2025,BIJ00108ALH1A +Homeopathy,Clinic/Polyclinic Only Consultation,I CARE CLINIC,"Behind Maharaja Hotel, Mecca Colony, Ring Road, Kalaburgi",28 Jan 2029,GLB00932HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR AKSHATA C ALVA MD PRODERMA SKIN CLINIC,"703, MOURISHKA TOWERS, KADRI-BENDOOR ROAD MALLIKATTE, MANGALURU 575002",09 Nov 2025,DKA00079ALCOC +Allopathy,Dental Lab or Clinic,JANANI DENTAL CLINIC,"B.H Road , Talaguppa sagar",09 Jun 2026,SMG00053ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,ortho clinic,"westgate terminus, first floor opposie to unity hospital, falnir, mangalore",09 Nov 2025,DKA00098ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,rajkalp clinic,Santibastwad,10 Nov 2025,BLG00040HOCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Kanchana Ayurveda Clinic & Medical,"Opposite GHP School, Main Road Uppinangady",21 Dec 2025,DKA00169AYCWD +Ayurveda,Clinic/Polyclinic with Observation,Shree Maruthi Clinic,"Shree Maruthi Clinic +12th Cross Near Muthyalamma Temple +Shanthinagar Doddabalapur",30 Sep 2026,BLR00053AYCWO +Allopathy,Hospital (Level 1B),UVIN CARE HOSPITALS PRIVATE LIMITED,"NO 117/1,OLD MADRAS ROAD, ULSOOR BUS STOP, ULSOOR,BANGALORE",05 Nov 2025,BLU01009ALH1B +Allopathy,Clinic/Polyclinic with Diagnostic Support,Mukund Orthopaedic center,"PRIYA COMPLEX, ANANTPUR ROAD, BELLARY",16 Apr 2026,BEL00189ALCDS +Allopathy,Dental Lab or Clinic,Udagatti Dental Oral & Maxillofacial Clinic,Shivaji circle Antapur hospital complex ground floor Mudhol -587313,20 Sep 2026,BGK00150ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,TRINITY GASTROENTEROLOGY & DIAGNOSTIC CENTER,"#410, 2ND FLOOR, 5TH MAIN ROAD, 2ND BLOCK HRNR LAYOUT, KALYAN NAGAR, BANAGLORRE-560043",30 Aug 2025,BLU00587ALCDS +Allopathy,Hospital (Level 1B),Swasa Hospital,"10th cross road, new PID No 16/2, New Jai Maruthi nagar, Nandini layout, BBMP ward no 43, Bangalore",25 Aug 2025,BLU00563ALH1B +Allopathy,Medical Diagnostic Laboratory,Metropolis Health care limited,"SKYCOURT GROUND FLOOR ,18-4-216/5, +ATTAVARA ROAD ,NEAR RAILWAY STATION, MANGALORE .",12 Dec 2026,DKA00606ALMDL +Allopathy,Hospital (Level 1A),Laxmi Ortho Centre,"Opp J.C Hospital, B.H Road, Arsikere",06 Jun 2027,HSN00187ALH1A +Allopathy,Clinic/Polyclinic with Diagnostic Support,THE FAMILY DOCTOR A Unit of Modern Family Doctor Pvt Ltd,"No 18/80/21, 2/1, Saroj Paradise, Thanisandra, Rachanahalli Main Road, Dr Shivaramkaranth Nagar, Bangalore",30 Aug 2025,BLU00591ALCDS +Allopathy,Hospital (Level 1A),UNITED HOSPITAL,BESIDE BVB COLLEGE GUMPA ROAD BIDAR,07 Feb 2026,BDR00021ALH1A +Allopathy,Hospital (Level 2),BHARATH HOSPITAL AND INSTITUTE OF ONCOLOGY A UNIT OF SADA SHARADA TUMOR AND RESEARCH INSTITUTE,"# 438, OUTER RING ROAD, HEBBAL MYSORE",11 Feb 2026,MYS00077ALHL2 +Homeopathy,Clinic/Polyclinic with Dispensary,MANGALA HOMEOPATHY CLINIC,"MILAGRES MENSION, HAMPANKATTA, MANGALURU",12 Jun 2027,DKA01040HOCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,SILVERLINE DIAGNOSTICS UNIT OF L H LIFE RESOURCES PVT LTD,"NO.190/1,6TH MAIN ROAD,DEFENSE COLONY, INDIRANAGAR,BENGALORE-560038",30 Aug 2025,BLU00594ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,KUSAGUR CHILDRENS CLINIC,"KUSAGUR CHILDRENS CLINIC +#1253/3A, SHIVAKUMARASWAMY BADAVANE, HADADI MAIN ROAD, DAVANAGERE.",29 Aug 2026,DVG00202ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,ATHARV WOMEN CARE AND FERTILITY CENTRE,"NO. 32, 3RD BLOCK, 2ND STAGE, NEAR BDA COMPLEX, NAGARBHAVI, BANGALORE -560072",06 Sep 2025,BLU00645ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,Sveta Clinic,"#448, 2nd cross, 1st stage, Indiranagar, Krishna temple road, Bangalore",24 Feb 2026,BLU01559ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,BENGALURU GENOMICS CENTER PVT LTD,"Plot. No.40/2, 2nd Floor, Ramanashree California Gardens, Opp. to Duo Marvel Layout, Ananthapura Main Road, Yelahanka, Bengaluru",30 Aug 2025,BLU00614ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,Divine Women and Child Speciality Clinic,"No. 506 4th cross 3rd phase 2nd block, BSK 3 rd Stage, Bangalore",12 Oct 2025,BLU00809ALCOC +Allopathy,Medical Diagnostic Laboratory,GENEMATRIX MOLECULAR DIAGNOSTICS AND RESEARCH,"PANJOOR PLAZA, 1ST MAIN ROAD, DR. RAJKUMAR ROAD, RAJAJINAGAR, BANGALORE",28 Sep 2025,BLU00780ALMDL +Allopathy,Medical Diagnostic Laboratory,HEALTHIANS DIAGNOSTICS LABS. EXPEDIENT HEALTHCARE MARKETING PVT LTD DBA HEALTHIANS.,"No.4BC-301, The Summit, 3rd A Main, 4th B Cross, EAST of NGEF BDA Layout, Kasturinagar East, Ramamurthy Nagar Main Road, Bengaluru",02 Sep 2025,BLU00630ALMDL +Allopathy,Dental Lab or Clinic,CLOVE DENTAL Star Dental Centre Private Limited,"No. 1 & 2, Gokul Mansion, Ground Floor, Hoodi Main Rd, Beside More Super Market, Surya Layout, Ayyappa Nagar, Bengaluru, Karnataka",25 Sep 2025,BLU00763ALDEN +Allopathy,Dental Lab or Clinic,CLOVE DENTAL Star Dental Centre Private Limited,"50, Bali Square, 1st Floor, Sai Baba Temple Road, Munnekollal, Bengaluru, Karnataka",08 Nov 2025,BLU01056ALDEN +Allopathy,Hospital (Level 1A),R.S.TRUST,"NO.125/2, KODAGALAHATTI, HOSAHALLI MAIN ROAD, HUNSMARNAHALLI, JALA HOBLI, BANGALORE-562157",17 Sep 2025,BLU00697ALH1A +Unani,Clinic/Polyclinic Only Consultation,ASHRAFI CLINIC,"No.39/2, 2nd main Road, 12th Cross, Chinnappa Garden, Bangalore",08 Nov 2025,BLU01072UNCOC +Ayurveda,Clinic/Polyclinic Only Consultation,MATHRU CLINIC,CPT MAIN ROAD HALAGUR VILLAGE AND HOBLI,01 Aug 2026,MAN00151AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SAI RAM SKIN AND V D CLINIC,"OPP. BANALE HOSPITAL, S. B TEMPLE ROAD KALABURAGI-585102",04 Aug 2026,GLB00289ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,ASHWINI CLINIC,UTTAR GATE MUDHOL DIST BAGALKOT,03 Oct 2026,BGK00166AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE LAKSHMI CLINIC,"K No 1847/874, Shop No 3, Opp old post office, Chaitra Complex Kethaganahalli Main Road Bidadi Ramanagara Taluk Ramanagar district",27 Apr 2027,RMG00061AYCWD +Allopathy,Hospital (Level 1A),Kids clinic India Pvt Ltd Cloudnine Hospital Bengaluru,"Kids clinic India Pvt Ltd Cloudnine Hospital, Shamabba plaza Muncipal No 1/79/4 Bellandur Village Varthur Hobli,Bengaluru East taluk, Bengaluru 560103",19 Sep 2026,BLU02388ALH1A +Allopathy,Hospital (Level 2),Sai Samarth Hospital,Station road Gandhi Gunj,19 Apr 2027,BDR00121ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,AAYUSH CLINIC,GANDHI CIRCLE MUDHOL,17 Jun 2027,BGK00409AYCOC +Allopathy,Clinic/Polyclinic with Observation,Moidu Poly Clinic,Moidu Tower Opp To Gandhi Circle Robertsonpet KGF,23 Feb 2027,KLR00100ALCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,AMRUTHA CLINICAL LABORATORY,RAG LALITH BUILDING K.M.MARG UDUPI-576101,28 Nov 2026,UDP00471ALCDS +Allopathy,Clinic/Polyclinic with Dispensary,DR.P.RAMAKRISHNA NAVADA ORTHOPEDIC CENTRE KUNDAPURA,"SRI KRISHNA BHAVAN,MUNCIPAL MAIN ROAD,KUNDAPURA-576201",20 Dec 2026,UDP00495ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,SRI DURGA CLINIC,"S.V.L COMPLEX, H M ROAD, HARPANAHALLI TALUK",29 Nov 2026,BEL00284ALCOC +Allopathy,Hospital (Level 2),ASHWINI HOSPITAL,"Shahabad Road, Chitapur",17 Nov 2026,GLB00368ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,KHILARI HEALTH CARE CLINIC,DR MAHANTESH U KHILARI BAMS AT/POST BENCHINMARDI TALUKA GOKAK DISTRICT BELAGAVI,17 Sep 2026,BLG00422AYCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,DR RAVI PATIL ORTHO AND NEURO CARE CENTRE,AYODHYA NAGAR BELAGAVI,24 Aug 2026,BLG00396ALSSH +Allopathy,Hospital (Level 1B),SHIVASUSHILS SHRI SAI HEALTH CARE CENTER,TILAK ROAD GODBOLE MALA MEENAXI CHOWK VIJAYAPUR,22 Jul 2027,BIJ00486ALH1B +Allopathy,Hospital (Level 1B),PATIL SPECIALITY HOSPITAL,"1st Cross, Maratha Colony, Dharwad.",20 Mar 2027,DWR00438ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,DHANAVANTARI CLINIC,VEGETIABLE MARKET LOKAPUR TQ MUDHOL DIST BAGALKOT,29 Mar 2027,BGK00317AYCOC +Allopathy,Hospital (Level 1A),M/s. Tanmay Hospital,"No. 66, B- 7, Pipeline Road, Entrance Vijayanagar, Bangalore- 560040",02 Feb 2027,BLU02956ALH1A +Ayurveda,Clinic/Polyclinic with Dispensary,MAHALASA CLINIC,"MAHALASA CLINIC. NEAR ROTARY CIRCLE, MAIN ROAD, BALEHONNUR",15 May 2027,CKM00104AYCWD +Allopathy,Blood Bank,sanjeevini blood center,"#276/A, 1st and 2nd flor Tridhala arcade PES Engineering college road VV Nagar Mandya",27 Apr 2027,MAN00219ALBLB +Allopathy,Medical Diagnostic Laboratory,SHREE MATA LABORATORY,"K. C. Road, Opp. Near Ganapati Temple, Ankola, U.K Distict",05 Dec 2027,UKA00267ALMDL +Allopathy,Blood Bank,Lions Blood Centre,"#2925/A-16, PRASAD ELEGANCE, 2ND FLOOR, ATTIGUPPE, VIJAYANAGAR",28 Nov 2028,BLU05986ALBLB +Allopathy,Clinic/Polyclinic Only Consultation,SKINOMY,"S-1869, 1st Floor, 1st H Main Rd, Near Mariappanapalya Park, opposite Hopcoms, Rajajinagar",13 Jun 2029,BLU07873ALCOC +Allopathy,Medical Diagnostic Laboratory,SRI LAKSHMI VENKATESHWARA CLINICAL LABORATORY,CHINTHAMANI ROAD H.CROSS,20 May 2027,CBR00093ALMDL +Allopathy,Clinic/Polyclinic with Diagnostic Support,SWISS MEDIC DIAGNOSTICS PVT LTD,"No. 62, 1st Floor, 7th Main, Hoysala Nagar, TC Palya, Main Road, Opp RK Apartment, Block - 1, Bangalore - 560016.",26 Jan 2027,BLU02923ALCDS +Allopathy,Clinic/Polyclinic with Dispensary,NAKSHA CLINIC,"Opp. P. S. Prabhu Petrol Bunk, Karwar Road, Ankola, U.K District",22 Mar 2027,UKA00087ALCWD +Ayurveda,Clinic/Polyclinic with Dispensary,Shri Kumareshwara Clinic,Nagaral Complex Bagalkot Road Hungund,07 Jun 2027,BGK00372AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,KISHORE CLINIC,"MARAKADA, KUNJATHBAIL KAVOOR POST",15 May 2027,DKA00878AYCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,AASTHA DIAGNOSTICS,"NO. 110, T.N. MUDDEGOWDA COMPLEX, NEAR POLICE STATION, OPP TO SBI BANK, MAGADI MAIN ROAD, TAVAREKERE, BENGALURU 562130",24 Feb 2027,BLU03077ALCDS +Allopathy,Hospital (Level 1A),SHRI SHANKAR NURSING HOME,"NO 38,MANUSHREE COMPLEX, 2ND CROSS, YELLUKUNTE, MADINANAGAR, MANGAMMANAPALYA MAIN ROAD, BANGALORE-560068",26 Jan 2027,BLU02918ALH1A +Allopathy,Dental Lab or Clinic,KSHEMA DENTAL CLINIC,"#6,6TH MAIN TEMLE ROAD ,VINAYAKANAGAR,5TH BLOCK JAYALAKSHMIPURAM MYSORE",26 May 2027,MYS00504ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,Anugraha Petra Clinic,"No. B, 6 and 7, Petra Complex, Opp. East and Restaurant, Kothanur, Hennur, Bagalur Main Road, Bengaluru-560077",26 Jan 2027,BLU02930ALCOC +12345678910...,1,2,3,4, +Allopathy,Clinic/Polyclinic with Observation,Relief Medical Center Nursing Home,"Near Police Station, Kanakapura Main Road, Thalaghattapura, Bengaluru-560109",15 May 2027,BLU03355ALCWO +Allopathy,Medical Diagnostic Laboratory,NOBLE DIAGNOSTIC CENTER,MARIGAMMA TEMPLE ROAD NEWPET GOWRIBIDANUR TQ CHICKABALLAPURA,23 May 2027,CBR00103ALMDL +Allopathy,Dental Lab or Clinic,Sai Ram Dental clinic,"#622/A, 13th Cross, 6th main, M C Layout, Vijayanagar, Bangalore",15 Aug 2028,BLU05226ALDEN +Allopathy,Dental Lab or Clinic,KAANTHA DENTAL CLINIC,"OPP AGRAHARA BUS STOP +MAIN ROAD, AGRAHARA",28 Sep 2028,CKM00318ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,SANJEEVANI CLINIC,"SANJEEVANI CLINIC, GROUND FLOOR, MATHA MOOKAMBIKA RESIDENCY, GANESH BEEDI STOP, KANA SURATHKAL",15 May 2027,DKA00905ALCWD +Allopathy,Clinic/Polyclinic with Observation,LAKSHMI CLINIC,"NO 2056, 13TH B MAIN, MOTHER DAIRY CROSS, NEW TOWN, YELAHANKA, BANGALORE-560065.",09 May 2027,BLU03340ALCWO +Allopathy,Hospital (Level 1A),UNITY HOSPITAL,"NO 886, 4TH STAGE, BEML LAYOUT, NEAR POLICE STATION MAIN ROAD, RAJARAJESHWARINAGAR, BANGALORE-560098",02 May 2028,BLU04600ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SHANTHI CLINIC,"SHANTHI CLINIC NAZARBAD MAIN ROAD, NAZARBAD, MYSORE",09 Mar 2027,MYS00373AYCOC +Allopathy,Dental Lab or Clinic,My Dentist Centre For Complete Dental & Implant care,"#9, 23rd Main, 50ft Road +Muneshwara block, Girinagar",22 Apr 2029,BLU07457ALDEN +Allopathy,Clinic/Polyclinic with Observation,SHRIKIRAN KID CARE CENTRE,"ALMASJID BUILDING, ASHOKA ROAD , SAKLESHPUR",06 Jun 2027,HSN00186ALCWO +Allopathy,Dental Lab or Clinic,Dental Care Centre,"1st floor, Shri Laxmi Towers, Chillimbi, Mangalore",09 Oct 2025,DKA00011ALDEN +Homeopathy,Clinic/Polyclinic with Dispensary,DWARAKAMAI SUPER SPECIALTY HOMOEOPTHAIC CLINIC,BEHIND SHIRDI SAI BABA MANDHIR CHILMBI MANGALORE,09 Oct 2025,DKA00016HOCWD +Homeopathy,Clinic/Polyclinic Only Consultation,VRUSHABHENDRA CLINIC,ATPOST BHAVIHAL,30 Jun 2026,BLG00303HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SRI SAI CLINIC,ARAKERI MANJUNATHA COMPLEX DEVADURGA CROSSS MAIN ROAD SIRWAR,15 Jun 2028,RCR00288AYCOC +Homeopathy,Clinic/Polyclinic with Dispensary,Dr Rais Homeopathy Center,"1st Floor, City Arcade, Balmatta Road, Bendoorwell,",25 Jun 2026,DKA00477HOCWD +Ayurveda,Clinic/Polyclinic Only Consultation,SHIFA CLINIC,ALLAPUR BASE NEAR HAKEEM CHOWK BIJAPUR,29 Dec 2025,BIJ00149AYCOC +Allopathy,Medical Diagnostic Laboratory,PATEL CLINICAL LABORATORY,MUNEER COMPLEX NEAR ALETTY CROSS MAIN ROAD GANDHINAGARA SULLIA,20 Jan 2026,DKA00226ALMDL +Allopathy,Dental Lab or Clinic,EXCELLENCE TOTAL DENTAL HEALTH CARE,"Trade Centre, 3rd Floor, Bunts Hostel Road, Mangalore",20 Jan 2026,DKA00212ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,The Bone Care and Aditi Kids Clinic,"No. 44, Nandini Layout Main Road, Near Subramanya Swamy Temple, opposite Yashaswi Gas Agency, Mahalakshmi Layout, Bengaluru",23 Nov 2025,BLU01175ALCDS +Allopathy,Dental Lab or Clinic,Daksh Dental,"# 155, First Floor, LIC Colony, Second Stage Srirampura,",27 Oct 2029,MYS01214ALDEN +Allopathy,Dental Lab or Clinic,Dr Mallyas Pearl Dental Clinic,"1-C, 1st Floor Kumudavati building, Balmatta, Mangalore",17 Mar 2027,DKA00723ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,Altacare Clinic,"muskaan, Coelho lane, Falnir, Mangalore",17 Mar 2027,DKA00726ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,MANGALORE UROLOGY CENTRE,"1ST FLOOR, WEST GATE TERMINUS BUILDING, FALNIR, MANGALORE",09 Nov 2025,DKA00107ALCOC +Allopathy,Dental Lab or Clinic,SRI DEVI DENTAL CLINIC,"SHOP NO. 7, MUNICIPAL COMPLEX OPPOSITE BUS STAND, GUBBI TALUK TUMKUR DISTRICT.",14 Feb 2026,TMK00098ALDEN +Ayurveda,AYUSH Therapy Centre,SAGAR AYUR PHARMA,"No. 38, LIC Colony, 10th Main Road, Jeevanbhima Nagar, Opp. IOC Petrol Bun, Bangalore",15 Oct 2025,BLU00833AYATC +Allopathy,Medical Diagnostic Laboratory,Omega Clinical Laboratory,"Door# 3-36-6, FS3, First Floor, Jeruzalem Heights, Near Kinnigoli Bustand, Kinnigoli",09 Oct 2025,DKA00012ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,Dr Jagannath Kamath,"Pulse Polyclinic , Opposite Prabhath Talkies +K.S.Rao Road, Mangalore",05 Nov 2025,DKA00072ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHREE MATE MANIKESHWARI CLINIC,VIDYA NAGAR COLONY MAILOOR ROAD BIDAR,21 Mar 2026,BDR00034AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,ANKUR CHILD CLINIC,"1ST FLOOR, ABOVE CANARA BANK, B.B.ROAD, CHIKKABALLAPUR",12 Jan 2026,CBR00007ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,VISHWAGURU CLINIC,Gandhi Chowk Yadgir,25 Jan 2026,YDR00011HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,ANJI CLINIC,"#2, Ground Floor, Near Bus Stop, Thagachaguppe, Kumbalgodu Post, Kengeri Hobli, Bangalore",20 Oct 2025,BLU00856AYCOC +Allopathy,Hospital (Level 2),ANUPAMAA HOSPITAL,"377, 13 TH A MAIN ROAD, 80 FEET ROAD ,A sector,YELAHANKA NEW TOWN",05 Oct 2025,BLU00787ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,SAI BALAJI PHYSIOTHERAPY,# 2537 OPP KRISHNA KALA MANDIRA MCC A BLOCK DAVANAGERE,21 Jun 2027,DVG00340ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,DR BEDREKAR HOMOEO CLINIC,"Azad Road, Tq.Alnavar, Dist.Dharwad.",10 Nov 2025,DWR00109HOCOC +Allopathy,Clinic/Polyclinic with Dispensary,SHAAFI HEALTH CARE,"RENJADY J.M CROSS ROAD, GREEN GROUND ,DERALAKATTE POST,MANGALORE",09 Nov 2025,DKA00086ALCWD +Allopathy,Hospital (Level 2),suresh hospital and maternity home,"opp mohan theatre, +hegganahalli main road +bangalore91",15 Oct 2025,BLU00840ALHL2 +Allopathy,Hospital (Level 1A),M/s. Sri Deepa Hospital.,"#644, 60 ft Road,5th Block,Vishweshwaraiah Nagar, Naer Ullal Upanagar, Bengaluru-560056",01 Nov 2025,BLU00897ALH1A +Ayurveda,AYUSH Therapy Centre,ARAVINDs AYURVEDA WELLNESS CENTRE,"1st Parallel Road, Durgigudi, Near Sparsha Hospital, Shimoga.",09 Jun 2026,SMG00054AYATC +Homeopathy,Clinic/Polyclinic with Dispensary,LIFE LINE HOMOEOPATHY,"BASEMENT, ESSEL CENTRE, M.G ROAD, MANGALORE",26 Jan 2026,DKA00258HOCWD +Allopathy,Hospital (Level 1A),D R M HOSPITAL,BEHIND OLD INDIAN BANK HOLALKERE ROAD CHITRADURGA,03 Feb 2026,CTR00016ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,THE EYE CLINIC,"ANNAIAH COMPLEX +HOSALLI ROAD, MANDYA",19 Feb 2026,MAN00071ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SANJEEVINI CLINIC,"No.85, Srigandhanagar, 3rd Cross, Hegganahalli Main Road, Bangalore",27 Oct 2025,BLU00871AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,LAKSHMI CHILD CLINIC,"BEHIND BHAVANI TILES +NEAR BALAMURGAN TEMPLE +CORONATION RAOD +BANGARPET",28 Feb 2027,KLR00126ALCOC +Allopathy,Medical Diagnostic Laboratory,ADITI CLINICAL LABORATORY,"CHAITRARAVI, 2ND CROSS KANAKA NAGARA NH 13 CHITRADURGA",07 Feb 2026,CTR00029ALMDL +Allopathy,Hospital (Level 1A),MEDIVISION HOSPITALS,"NO.20 AND 21, 1ST CROSS, RAMANJANEYA LAYOUT, RING ROAD, MARATHALLI, BANGALORE-560037.",28 Oct 2025,BLU00885ALH1A +Allopathy,Dental Lab or Clinic,SURAKSHA SPECIALITY DENTAL CARE,"1ST FLOOR T.M.P PLAZA, BESIDE MORE SUPER MARKET, S.N PET MAIN ROAD, BALLARI",16 Apr 2026,BEL00163ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,GIRISH CHILDREN CLINIC/ VOLGA DENTAL CLINIC,"NO.793, 8TH A CROSS, A SECTOR, YELAHANKA NEW TOWN, BANGALORE-560064.",09 Oct 2025,BLU00798ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,PRAGATI CLINIC,NEAR SWATANTRA COLONY ATHANI ROAD VIJAYAPUR,20 Jan 2028,BIJ00644AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR RANJAN HEALTH CLINIC,"# 114, BOGADI, 2ND STAGE, AMRUTHANANDAMAYI SCHOOL, PARVATHI ARCADE, MYSORE",07 Aug 2027,MYS00640ALCOC +Allopathy,Hospital (Level 1B),ANNAPURNA MULTISPECIALITY HOSPITAL,"Shri Krishnadevaraj Marga, Bustand Road GANGAVATHI 583227 Dist Koppal",17 Sep 2027,KPL00112ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,BHARAT CLINIC,"BESIDE KARNATAKA BANK VIDYA NAGAR ROAD, JEWARGI 585310",05 Oct 2028,GLB00875AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Chirayu Clinic,"Vikhyath Complex, Kumbra Puttur",14 Jun 2027,DKA01099AYCWD +Allopathy,Dental Lab or Clinic,Sri Ranga Arogyadhama Dental Clinic,"#1078, Dr Modi hospital road, W.O.C road, Mahalakshmipura, Bangalore",12 Oct 2027,BLU03877ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,KIRAN CLINIC,"TANGADAGI ROAD BASAVA NAGAR MUDDEBIHAL, DIST VIJAYAPUR",09 Jun 2027,BIJ00461ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE ATMANANDA CLINIC,"AT-Hosur yattinalli, Tq-Shiggaon 581205",04 Oct 2028,HVR00573AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,SUPER SPECIALITY POLYCLINIC,3935/68 OULKAR COMPOUND KALIMBRAI COLLEGE ROAD BELAGAVI-590001,31 May 2027,BLG00706ALCOC +Allopathy,Clinic/Polyclinic with Observation,KAPILA EYE CLINIC,"NO.2989/G, UPSTAIRS, 12TH MAIN, HAL 2ND STAGE, INDIRANAGAR, BANGALORE-560008.",06 Jul 2027,BLU03488ALCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,SUSHRUTA DIAGNOSTIC CENTRE,"KAPSE BUILDING BESIDE GOVT. HOSPITAL, KIUSHTAGI -583277",05 Feb 2028,KPL00168ALCDS +Allopathy,Medical Diagnostic Laboratory,Praharsha fertiplus,"35 / 2, Dr DVG Road, Basavanagudi Bangalore 560004",15 Jun 2027,BLU03473ALMDL +Allopathy,Medical Diagnostic Laboratory,Dhanvantahri Clinical Laboratory,"Prasanna Complex, School Road, Vittal",04 Jul 2029,DKA02247ALMDL +Allopathy,Diagnostic Imaging Centre,SIRA HEALTH SERVICES,SOMESHWARA COMPLEX Dr AMBEDKAR ROAD GANDHI NAGAR K R EXTENSION SIRA TALUK TUMKUR DISTRICT 572137,13 Jul 2027,TMK00458ALDIC +Allopathy,Clinic/Polyclinic Only Consultation,Shourya Clinic,"Kotaladinne Village, Gowribidanur Taluk, Chikkaballapura District",12 Sep 2027,CBR00160ALCOC +Allopathy,Hospital (Level 1A),SHREE ANIL KALE MEMORIAL ASHIRWAD NURSING HOME BRANCH GAJENDRAGAD,"VANASHRI PLAZA, RAJUR ROAD, GAJENDRGAD",12 May 2027,GDG00122ALH1A +Homeopathy,Clinic/Polyclinic with Dispensary,ADITYA CLINIC,GOKUL NAGAR MUTAGA,11 Sep 2028,BLG01311HOCWD +Ayurveda,Hospital (Level 1B),PRITHVI HEALTHCARE PVT LTD,"NO. 149, HSR 5TH SECTOR, HSR LAYOUT, HSR RING ROAD, BANGALORE - 34",12 Oct 2027,BLU03870AYH1B +Allopathy,Clinic/Polyclinic Only Consultation,DR RAJARAM ALLOPATHIC CLINIC,IV 710/1 KRISHNA COMPLEX BASEMENT FLOOR OPP GIRIJA CLINIC MAIN ROAD DARBE PUTTUR,14 Jun 2027,DKA01103ALCOC +Allopathy,Medical Diagnostic Laboratory,MANJUNATHA DIAGNOSTIC CENTRE,MG ROAD GURIBIDHNUR,15 Sep 2027,CBR00179ALMDL +Homeopathy,Clinic/Polyclinic Only Consultation,RAJESHWARI CLINIC,RAJESHWARI CLINIC MAHADEV ROAD JYOTI NAGAR CROSS KANGRALI K H BELAGAVI,19 Jun 2029,BLG02146HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,BASAV POLYCLINIC,"NO.43/A, 1ST STAGE, 5TH PHASE, 60FEET ROAD, WOC ROAD, MAHAGANAPATHINAGAR, BENGALURU-560010",15 Sep 2027,BLU03726AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SHRI RAKSHA PAEDIATRIC SURGICAL CENTRE,"F-12, B-Block, 1st Floor, Revankar Complex, Court Circle, Hubballi.",08 Oct 2027,DWR00545ALCOC +Allopathy,Clinic/Polyclinic with Observation,SANDEEP SKIN AND HAIR CLINIC,"# 50, 4TH MAIN, 15TH CROSS, VIDYARANYAPURAM, MYSURU - 570008",26 May 2027,MYS00492ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,CHANNABASAVA ENT CARE,"SHAIKH COMPLEX, MINAXI CHOWK, VIJAYAPUR",22 Jul 2027,BIJ00491ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,FALNIR DIAGNOSTIC CENTRE,16-7-435/2 CAUVERY BUILDING FALNIR ROAD MANGALORE 575002,21 Jul 2027,DKA01156ALCDS +Allopathy,Hospital (Level 1A),APOORVA CHILDREN HOSPITAL SND,WARD NO-16 ADARSHA COLONY SINDHNAUR,26 Apr 2027,RCR00080ALH1A +Allopathy,Hospital (Level 2),BILVA HOSPITAL,"No. 21 and 22, 2nd Main Road, P.G. Halli, Bengaluru",12 Jan 2028,BLU04106ALHL2 +Allopathy,Medical Diagnostic Laboratory,METROPOLIS HEALTH CARE LIMITED,"# 1743, # 1473, MISSION HOSPITAL ROAD, MANDI MOHALLA, MYSORE",01 Jul 2027,MYS00568ALMDL +Allopathy,Hospital (Level 1A),PUNASRU ORTHO CENTRE,"NO.952. 18TH A CROSS, 18TH MAIN ROAD, IDEAL HOMES TOWNSHIP, RAJARAJESHWARINAGAR, BANGALORE-560098.",05 Aug 2027,BLU03553ALH1A +Allopathy,Clinic/Polyclinic with Dispensary,SHREYA CLINIC,"NO.438, 2ND MAIN ROAD, OIL MILL ROAD, K R PURAM, BANGALORE-560036.",05 Aug 2027,BLU03560ALCWD +Allopathy,Dental Lab or Clinic,PARKALA DENTAL CLINIC,"1ST FLOOR, VITTAL ARCHADE, OLD PATIL CLOTH STORES, PARKALA, UDUPI",07 Jul 2027,UDP00761ALDEN +Ayurveda,Hospital (Level 4)(Teaching),PRAYAVI AYURVEDIC HOSPITAL AND RESEARCH CENTER,PLOT NO 6B KIADB AREA KOLHAR K BIDAR,20 Jul 2027,BDR00168AYHL4 +Allopathy,Dental Lab or Clinic,Pushpanjali dental clinic,Napoklu town,03 Jul 2027,KDG00093ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,CHANDRODAYA CLINIC,"Milk diary building,Emmenatha village, Tayalur hobli",12 Jun 2027,KLR00160ALCWD +Allopathy,Clinic/Polyclinic with Observation,SARASWATHI POLYCLINIC,"HOSPITAL ROAD, YELAHANKA, BANGALORE-560064.",18 Sep 2027,BLU03742ALCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,CAUVERY DIAGNOSTIC CENTER,"SRIMANGLA MAIN ROAD, MACHIMAADA GANESH COMPLEX, T SHETTIGERI SOUTH KODAGU",23 Jan 2028,KDG00156ALCDS +Allopathy,Hospital (Level 1A),MANGALORE INSTITUTE OF ONCOLOGY PVT LTD,"1ST FLOOR BUSINESS BAY CENTER +KUNJIBETTU ,UDUPI-576103",24 Nov 2027,UDP00905ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SRI LAKSHMI NARASIMHA CHIKITSALAYA,"CHATRAKERI, GANDHI CHOWKA AZAD ROAD THIRTHAHALLI",09 Apr 2028,SMG00363AYCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Dr B Ramana Rao Clinic,"No 94/H, 9th Cross, 13th Main, Rajamahal Vilas Extn Bangalore-560080",29 Nov 2027,BLU03971ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,MONA CLINIC & LAB,"Ward Office Road, E Block 2nd Stage, Rajajinagar",13 Jul 2028,BLU05010ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHRI GURU CLINIC,SHIVAJI CIRCLE MUDHOL DIST BAGALKOT,03 Oct 2026,BGK00163AYCOC +Allopathy,Hospital (Level 1B),H D BAGWAN MEMORIAL CHILDREN HOSPITAL,"BEHIND CENTRAL BUS STAND, SAQAF ROZA ROAD, VIJAYPUR",19 Aug 2026,BIJ00231ALH1B +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,196/C DON COMPLEX TRASI POST KUNDAPURA TALUK,28 Nov 2026,UDP00448AYCWD +Allopathy,Hospital (Level 2),SAGAR NURSING HOME AND LASER CENTER,"NEAR JAIL CIRCLE, 1ST CROSS, ACHUTH RAO LAYOUT SHIVAMOGGA - 577 201.",23 Dec 2026,SMG00130ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Mahadeshwara Clinic,"Kolipalya Village, Mukan palya Post, Chamarajanagar Taluk DIst",15 Aug 2026,CNR00019AYCOC +Allopathy,Dental Lab or Clinic,VIDYANAGAR DENTAL CLINIC,"VIDYANAGAR, BH ROAD, SHIVAMOGGA.",23 Dec 2026,SMG00134ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,KIRAN DIAGNOSTIC & CONSULTATION CENTRE,NEAR DISTRICT HOSPITAL TURUVANUR ROAD CHITRADURGA,03 Aug 2026,CTR00109ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,Hawaldar Clinic,"Timmapur,Shiggaon,Haveri,581205",18 Aug 2026,HVR00197AYCOC +Allopathy,Clinic/Polyclinic with Observation,Vaxiassist Health Initiatives Pvt Ltd,"#18/2A, 1st floor, Ambalipura, Sarjapur main road, Bellandur gate, Bengaluru",28 Nov 2026,BLU02645ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,MANGALORE CLINIC,"#-59-20, Ghalib Street, +Lashkar Mohalla, Near Govt. School, Shimoga",23 Nov 2026,SMG00085ALCOC +Allopathy,Hospital (Level 2),VAM HOSPITAL,"OOTY-MYSORE ROAD, GUDNLUPET TOWN CHAMARAJANAGAR DISTRICT",13 Jul 2027,CNR00045ALHL2 +Allopathy,Clinic/Polyclinic with Diagnostic Support,RASHI DIAGNOSTICS INDIA PVT LTD,"NO.4/3,D R PRIDE COMPLEX ,K NARAYANAPURA ,KOTHANUR POST,BENGALORE -560077",26 Jan 2027,BLU02938ALCDS +12345678910...,1,2,3,4,5 +Ayurveda,Clinic/Polyclinic Only Consultation,Maruthi Clinic,No.242/2 Madura Garments Road Parappanaagrahara Electronic City Bengaluru,03 Aug 2026,BLU02156AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Shree Annadani Clinic,No.180/2 Near Bus Stop Hosur Main Road Singasandra Bengaluru,03 Aug 2026,BLU02157AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Nimishamba Ayur Clinic,"#967, 7th Main, 1st Stage, Hebbal, Mysore.",07 Jul 2027,MYS00609AYCOC +Allopathy,Medical Diagnostic Laboratory,RAAGHU DIAGNOSTIC LABORATORY,"GURU SHREE, 1ST CROSS, CSI LAYOUT , BEHIND GAYATHRI TALKIES AND MALABAR GOLD SHOP, B.H.ROAD, TUMAKURU-572102",29 Jul 2026,TMK00189ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,Akshay Clinic,EETI Complex Madalagatta Circle Huvinahadagali,22 Nov 2026,BEL00278AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR.SOWMYAS CHILD CARE CLINIC,"No.11, Muddinapalya Main Road, BEL Layout, 1st Stage, Magadi Road, Bangalore - 560091",13 Jul 2026,BLU02098ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Ashwini Health Centre,No.88/1 Chikka Begur Gate 7th Mile Hosur Road Bengaluru,18 Aug 2026,BLU02221AYCOC +Allopathy,Dental Lab or Clinic,SPECIALITY DENTAL CLINIC,"1ST FLOOR ESSEL CHAMBERS, OPP. MEDICARE CENTRE, KARANGALPADY, MANGALORE",12 Dec 2026,DKA00612ALDEN +Ayurveda,Hospital (Level 4)(Teaching),SGESS DR. N. A. MAGADUM AYURVEDIC MEDICAL COLLEGE HOSPITAL RESEARCH CENTRE ANKALI.,A/p Ankali Taluk Chikodi District Belagavi,01 Oct 2026,BLG00430AYHL4 +Allopathy,Dental Lab or Clinic,SHREE DURGA DENTAL CLINIC,IB ROAD KUSHALNAGARA,26 Jun 2027,KDG00078ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,ENT CLINIC,"ENT CLINIC, RAAG LALITH BUILDING, K.M. MARG, UDUPI",28 Nov 2026,UDP00469ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SHANKARA RETINA CARE,NITTUVALLI ROAD SAYSAM LAYOUT SIDDESHWARA MILL COMPOUND,30 Mar 2027,DVG00291ALCOC +Integrated System,Clinic/Polyclinic with Dispensary,Shanthi Clinic,"9th Cross, T.K.Layout, Mysore.",07 Jul 2027,MYS00607ISCWD +Ayurveda,Clinic/Polyclinic with Dispensary,Sneha clinic,"Sneha clinic. Hura +NANJANGUD taluk",01 Nov 2027,MYS00711AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,AMARA SKIN CLINIC,"No.1065/a12, 2nd Floor, 9th Main, Devarachikkanahalli, Bangalore - 560076",11 Jul 2026,BLU02089ALCOC +Allopathy,Medical Diagnostic Laboratory,Medlife Diagnostic centre,"1-26/10, T S Complex, K C Nagar, K C Road, Talapady Post",01 Aug 2026,DKA00504ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,RAVI CLINIC,"NO.45/1, NGOS COLONY, KAMALA NAGAR, BANGALORE-560079.",23 Aug 2026,BLU02272AYCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,LIFE INN HEALTHCARE AND DIAGNOSTIC,"4M-409, Govinda Narayani Plaza, East of NGEF Layout, Dooravani Nagar, Near Airtel Office, Ramamurthy Nagar, Bangalore - 560016",11 Jul 2026,BLU02088ALCDS +Allopathy,Dental Lab or Clinic,Align & Smile Orthodontic & Multispeciality Dental Clinic,"No 31/1A1, ekam boutique +Behind star market ,Balagere main road +Balagere , Panathur ,Bangalore 560087",07 Sep 2026,BLU02321ALDEN +Ayurveda,Clinic/Polyclinic Only Consultation,SRI RANGANATHA CLINIC,"Post Office Road, Srirampura, Hosadurga Taluk 577542 Chitradurga District",03 Aug 2026,CTR00114AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,MONA CLINIC & LAB,"Ward Office Road, E Block 2nd Stage, Rajajinagar",13 Jul 2028,BLU05010ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHRI GURU CLINIC,SHIVAJI CIRCLE MUDHOL DIST BAGALKOT,03 Oct 2026,BGK00163AYCOC +Allopathy,Hospital (Level 1B),H D BAGWAN MEMORIAL CHILDREN HOSPITAL,"BEHIND CENTRAL BUS STAND, SAQAF ROZA ROAD, VIJAYPUR",19 Aug 2026,BIJ00231ALH1B +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,196/C DON COMPLEX TRASI POST KUNDAPURA TALUK,28 Nov 2026,UDP00448AYCWD +Allopathy,Hospital (Level 2),SAGAR NURSING HOME AND LASER CENTER,"NEAR JAIL CIRCLE, 1ST CROSS, ACHUTH RAO LAYOUT SHIVAMOGGA - 577 201.",23 Dec 2026,SMG00130ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Mahadeshwara Clinic,"Kolipalya Village, Mukan palya Post, Chamarajanagar Taluk DIst",15 Aug 2026,CNR00019AYCOC +Allopathy,Dental Lab or Clinic,VIDYANAGAR DENTAL CLINIC,"VIDYANAGAR, BH ROAD, SHIVAMOGGA.",23 Dec 2026,SMG00134ALDEN +Allopathy,Clinic/Polyclinic with Diagnostic Support,KIRAN DIAGNOSTIC & CONSULTATION CENTRE,NEAR DISTRICT HOSPITAL TURUVANUR ROAD CHITRADURGA,03 Aug 2026,CTR00109ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,Hawaldar Clinic,"Timmapur,Shiggaon,Haveri,581205",18 Aug 2026,HVR00197AYCOC +Allopathy,Clinic/Polyclinic with Observation,Vaxiassist Health Initiatives Pvt Ltd,"#18/2A, 1st floor, Ambalipura, Sarjapur main road, Bellandur gate, Bengaluru",28 Nov 2026,BLU02645ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,MANGALORE CLINIC,"#-59-20, Ghalib Street, +Lashkar Mohalla, Near Govt. School, Shimoga",23 Nov 2026,SMG00085ALCOC +Allopathy,Hospital (Level 2),VAM HOSPITAL,"OOTY-MYSORE ROAD, GUDNLUPET TOWN CHAMARAJANAGAR DISTRICT",13 Jul 2027,CNR00045ALHL2 +Homeopathy,AYUSH Therapy Centre,Dr Health Curanum Healthcare Pvt Ltd,"No.770, 1st Floor, 8th Cross Rd, MC Layout, Vijayanagar, Bengaluru",05 Jan 2029,BLU06379HOATC +Yoga and Naturopathy,Clinic/Polyclinic Only Consultation,Shinko Yoga Natural Health Wellness Centre,"No. 335, 1st Floor, 4th Cross Road, Arekere Mico Layout 1st phase, Bangalore.",03 Sep 2028,BLU05377YNCOC +Allopathy,Dental Lab or Clinic,Jade Dental Care,"#80 Ranganatha Layout, Mahadevpura, Bengaluru",04 Aug 2029,BLU08362ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,SRI LAXMI CLINIC,"no 95/70, Chikkabanavara, Opp. Gangamma Temple, Hesaraghatta main Road, Bangalore - 560090",23 Oct 2029,BLU09469ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,KIDS CLINIC INDIA LIMITED CLOUDNINE CLINIC,"Site No. 200, Situated at Rajiv Gandhi Nagar, NTI Layout, 1st Phase, Kodigehalli Village, Yelahanka Hobli, Bangalore North Taluk, Bangalore - 560092",17 Jul 2028,BLU05053ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,Sri Adhishakthyathmaka Annapoorneshwari Charitable Dispensary Centre,"Shri Kshethra, Horanadu Post, Mudigere Taluk, Chikamagalur-Dist, Pin 577181",09 Jul 2028,CKM00298ALCOC +Ayurveda,Hospital (Level 1A),AYURDHAMA AYURVEDA HOSPITAL,"D.NO. 2-211/6A, OLD GATE, SULLIA, D.K",24 Aug 2028,DKA01784AYH1A +Allopathy,Dental Lab or Clinic,SCULPT THE MAXILLOFACIAL CLINIC,"NO 315, SAPTHAGIRI, 1ST FLOOR, 60FT ROAD, HEALTH LAYOUT, ANNAPOORNESHWARINAGAR, BANGALORE- 560091",06 Jul 2028,BLU04991ALDEN +Integrated System,Clinic/Polyclinic with Dispensary,Ashwini Clinic,"No 26 Ashwini Clinic, Railway Parallel Road, RPC Layout, Hampinagar, Vijayanagar 2nd stage,Bangalore - 560104",08 Feb 2029,BLU06734ISCWD +Ayurveda,Clinic/Polyclinic with Dispensary,SRI MARUTHI CLINIC,"No. 681/1, Santhosini Complex, Ambabhavani Temple Road, Chikkabettahalli, Vidyaranyapura Post, Bangalore",09 Jul 2028,BLU04995AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,HEMAVATHI CLINIC,"Shop.No.2, Ground Floor HKS Hostel Building, Hosakoppallu Main Road, Hassan.",14 Mar 2029,HSN00360ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Shree Mallikarjuna Clinic,"subbramani complex, immadihali main road white field,bangalore 560066",29 Dec 2028,BLU06280AYCOC +Allopathy,Hospital (Level 2),GJM HOSPITAL,"#44, JAYA ARCADE, HESARAGATTA MAIN ROAD, T DASARAHALLI, BENGALURU-57",26 Dec 2028,BLU06237ALHL2 +Allopathy,Clinic/Polyclinic with Diagnostic Support,DR. SARASWATHIs MATERNITY AND FERTILITY CLINIC,"2A, 1st Floor, Belamkar's Complex, Club Road, Vivekanand Hospital Road, Near Court Circle, Hubballi 580029",08 Sep 2028,DWR00786ALCDS +Allopathy,Hospital (Level 2),Omkar Hospital,"Plot No.711,4th Cross, 8th Main,H MT Layout,R T Nagar, Bengaluru - 560032",30 Jul 2028,BLU05141ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,Sri Multispeciality Clinic,"RC Road, OPP CSI Hospital, Hasssan.",13 Aug 2028,HSN00336ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SARVANI CLINIC & IMMUNIZATION CENTRE,"SHOP NO. 25B AND C, GROUND FLOOR, YENEPOYA MALL, OPP. GIRIYAS, KADRI, MANGALORE - 575003",11 Jul 2028,DKA01717ALCOC +Allopathy,Clinic/Polyclinic with Observation,Shri Guru Dental Clinic and Health Care Center,"Shop no 22, Tarun Complex , Nyanappahalli Main Road, Devarachikkana Halli, Bengaluru, 560076",16 Jul 2028,BLU05037ALCWO +Homeopathy,Clinic/Polyclinic Only Consultation,ST. MARYS HOMEO CLINIC BELTHANGADY,"UJIRE POST, BELTHANGADY",13 Mar 2029,DKA02080HOCOC +Allopathy,Hospital (Level 2),ONKAR HOSPITAL,"Onkar hospital,1st parallel road,Durgigudi, Shimoga",12 Jul 2028,SMG00418ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,LAASYA WOMENS CLINIC,"No.433, Ground floor, +Next to Karnataka Bank, Gaddige main road,Bogadi,Mysore-570026",02 Dec 2029,MYS01326ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,UMA CLINIC,"Uma Clinic Kadambeshwar Road, Banavasi, Sirsi 581318",30 Jan 2029,UKA00541AYCWD +Allopathy,Medical Diagnostic Laboratory,VINAYAKA DIAGNOSTIC CENTRE,"KOLUVIGE ROAD, OPPOSITE TO BASAVESHWARA TEMPLE HANAGODU HUNSUR - 571105",25 Dec 2028,MYS00963ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,DR SPK EYE CLINIC,"256/8 1st cross opposite 2nd main road +Ganganagar, Bangalore-560032",14 Feb 2029,BLU06797ALCOC +Allopathy,Dental Lab or Clinic,CARE AND SMILE DENTAL CLINIC,"NO.3-692/A, PATIL COMPLEX, NEAR MILAN CHOWK, GAZIPUR, KALABURAGI-585101",09 Aug 2028,GLB00821ALDEN +Allopathy,Hospital (Level 1B),NMC RURAL HEALTH TRAINING CENTRE,Singanodi Tq Raichur,14 Mar 2029,RCR00372ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,Sanjeevini Hospital,Main Road Mantur Tq Mudhol,09 Jul 2029,BGK00794ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Wellright Lifecare Polyclinic and Diagnostic Centre,"Shop No.11, R K Hegde Nagar Main Road, Opp. Regal Hospital, Near Bhartiya City, Chokkanahalli Yelahanka, Bangalore - 560064",17 Dec 2028,BLU06171ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,SANTHULANA,"DOOR NO.KAT-7-59/5,GROUND FLOOR,K K COMPLEX,7TH BLOCK,KUKKADY STOP,KATIPALLA,KRISHNAPURA,SURATHKAL,MANGALORETQ, D.K DISTRICT",22 May 2029,DKA02187AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,Shri Banashankari Clinic,HUNNUR,08 Mar 2029,BGK00728AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SAINATH CLINIC,H K Road Mudhol,29 Oct 2029,BGK01011ALCOC +Allopathy,Dental Lab or Clinic,REBECCA DENTAL CLINIC,"Arihant Atria Apartment Complex, Saptapur 2nd Cross, Dharwad",20 Jul 2029,DWR01056ALDEN +Allopathy,Dental Lab or Clinic,Jia Dental Clinic,"#524, Anikethana Main Road, Kuvempunagar, Mysuru",05 Aug 2029,MYS01125ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,SHREYA CLINIC,"AT POST YADUR, TALUKA CHIKODI ,DIST-BELAGAVI, PIN-591213",09 Jan 2029,BLG01698AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,AMAN CLINIC,NEAR BHARATH CO OPERATIVE SOCIETY MAGADI TOWN RAMANAGARA DISTRICT,20 Jun 2029,RMG00263AYCOC +Homeopathy,Clinic/Polyclinic Only Consultation,NOORJI CLINIC,AT POST DEVANAGAON TQ SINDGI DIST VIJAYAPUR,18 Mar 2029,BIJ01016HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,Trinaya eye care clinic and opticals,"First floor , padil gate building , padil junction , mangalore",21 Apr 2029,DKA02149ALCOC +Allopathy,Dental Lab or Clinic,happydent,"Times square building, 1st floor,Above KFC, Kadri, Mangalore-575002.",09 Oct 2025,DKA00008ALDEN +Allopathy,Dental Lab or Clinic,Caps & Crowns Dr.Haifa Dent Care,"Super Mart, Marnamikatte, Mangalore",20 Jan 2026,DKA00199ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,Dr.Gillians & Dr Chetans polyclinic,"Chetana nursing home premises, Mallundur road, chikkamagaluru",09 Jul 2028,CKM00304ALCWD +Allopathy,Dental Lab or Clinic,Susheela dentacare,"Sara arcade +Melkar",09 Oct 2025,DKA00028ALDEN +Homeopathy,Clinic/Polyclinic Only Consultation,Shri Sai Clinic,"Shivaji Road, Yallur",07 Feb 2026,BLG00109HOCOC +Allopathy,Dental Lab or Clinic,MAHAGANAPATHI DENTAL CLINIC,"MAHAGANAPATHI DENTAL CLINIC +SHIVAKRUPA BULDING, +NELLYADY +PUTTUR TQ",21 Dec 2025,DKA00170ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,MAKANDAR CLINIC,COLLEGE ROAD OPP DCC BANK NIDAGUNDI TQ B BAGEWADI DIST VIJAYAPR,28 Sep 2025,BIJ00111ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,DR T RATHNAKAR,"First Floor, Athena Hospital Complex, Falnir Road, Mangalore",09 Oct 2025,DKA00029ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,Dhanvantri Clinic,"Dhanvantri Clinic, Near Yallalingeshwar Medical, Sedam Road, Sulepeth,",08 Nov 2025,GLB00026HOCOC +Homeopathy,Clinic/Polyclinic Only Consultation,Makandar Clinic,Behind Quba Majid Kudachi-591311,10 Nov 2025,BLG00028HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Upadhye Dispensary,"Tarihal Road, Vijay Nagar, Halaga",10 Sep 2025,BLG00011AYCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SURAKSHA HOMEOPATHY HEALTHCARE,"#91, 19TH MAIN, 60 FEET ROAD, 6TH BLOCK, KORAMANGALA",06 Sep 2027,BLU03657HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,Saraswati Children Clinic,"Wari Complex, Opposite Corporation Office, Lamington Road, Hubli",01 Mar 2026,DWR00212ALCOC +Ayurveda,Clinic/Polyclinic with Observation,AIMAN CLINIC,"SUBHASH CIRCLE, STATION ROAD, HAVERI",11 Feb 2026,HVR00034AYCWO +Allopathy,Clinic/Polyclinic with Diagnostic Support,Dhatri Health Care,"Survey no. 3/2, Hagadur Colony, Near Sri Rama Temple, Immadihalli road, Whitefield",19 Oct 2028,BLU05747ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,"""SUDHANWA"", VYAVASAYA SEVA SAHAKARA SANGA, OPP. POLICE STATION, PUNJALKATTE",09 Nov 2025,DKA00105AYCWD +Allopathy,Clinic/Polyclinic with Dispensary,CLINIC,FARANGIPET,08 Feb 2026,DKA00277ALCWD +Allopathy,Dental Lab or Clinic,ZAHRA DENTAL CLINIC,"JANAKI DHAMA BUILDING, KAMBLA CROSS ROAD, KUDROLI , MANGALORE",20 Jan 2026,DKA00198ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,GAGAN CHILDRENS HOSPITAL,OPPOSITE JUNIOR COLLEGE THAIR MAIDAN HUMNABAD,07 Feb 2026,BDR00023ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SHREE RAKSHA CLINIC,"Zansi Laxmi Road, Tq.Alnavar, Dist.Dharwad.",19 Oct 2025,DWR00081HOCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,SWASTIKA HOSPITAL,"NEAR JAIL CIRCLE, KUVEMPU ROAD",17 May 2026,SMG00047ALSSH +Allopathy,Clinic/Polyclinic with Diagnostic Support,CLINRAD DIAGNOSTICS& RESEARCH CENTRE,"#725, CMH ROAD,NEAR CMH HOSPITAL. INDIRA NAGAR, BANGALORE-560038",15 Sep 2025,BLU00679ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,ASHWINI CLINIC,NEAR KSRTC DEPO NO 1 OPP MUNDEWADI HOSPITAL VISHAL NAGAR VIJAYAPUR,02 Apr 2026,BIJ00187AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,BALAJI CLINIC,MAIN ROAD KAVITHAL,26 Jun 2028,RCR00304AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,KRISHNA CLINIC,"No.40, Ground Floor, 1st Main Road, Saraswathipuram Main Road, Nandini Layout, Bangalore",10 Sep 2025,BLU00668ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,JEEVAMRUT CLINIC,"#60, Mahasati Nilaya, 7th Cross, Sangolli Rayanna Nagar, Dharwad",28 Sep 2025,DWR00039AYCOC +Allopathy,Medical Diagnostic Laboratory,Medical laboratory,"Deerghayu diagnostic centre, durga complex, baje road, Hiriyadka, udupi",26 Jan 2026,UDP00061ALMDL +Allopathy,Dental Lab or Clinic,DR. REDDYS CREATIVE SMILES,"# 301 , 1ST ‘D ' CROSS , 2ND ‘C’ MAIN , 8TH BLOCK , KORAMANGALA, BANGALORE",25 Sep 2025,BLU00757ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,PRIME ORTHOPEDICS,"NO 1309 , KANASU , 1ST FLOOR , 9TH CROSS , J.P NAGAR , 1ST +PHASE , BANGALORE",25 Sep 2025,BLU00767ALCOC +Allopathy,Dental Lab or Clinic,SHRI KAMAKSHI DENTAL CLINIC,"#2, Ground Floor, SKD Heights, Vidyanagar, P.B.Road, Hubballi.",19 Oct 2025,DWR00083ALDEN +Ayurveda,Clinic/Polyclinic Only Consultation,JYOTI CLINIC,"Rajput Building, Nekar Nagar Main Road, Tippu Nagar, Old Hubli, Hubballi.",28 Sep 2025,DWR00030AYCOC +12345678910...,1,2,3,4,5 +Allopathy,Clinic/Polyclinic with Diagnostic Support,M/s. V Two Diagnostics,"No. 113/114, Rukmininagar, Nelagadranahalli Main Road, Near Hatsun Daily Nagasandra Post, Bangalore-560073",22 Jul 2026,BLU02113ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,POORNIMA CLINIC,DR. JYOTHI PRAKASH KOKKARNE UDUPI,01 Mar 2027,UDP00575AYCWD +Allopathy,Hospital (Level 1A),Venlakh Hospital A Unit of Gaekwad Medical Associates Pvt Ltd.,"No. 123, 5th Main Road, Chamarajpet, Bengaluru-560018",08 Jul 2026,BLU02074ALH1A +Integrated System,Clinic/Polyclinic with Dispensary,GOOD SHEPARD CLINIC,"# 828, NEW KANTARAJE URS ROAD, KUVEMPUNAGAR, MYSORE",07 Jul 2027,MYS00606ISCWD +Unani,Clinic/Polyclinic Only Consultation,MEDI SURGE CLINIC,NO 2 6TH CROSS OIL MILL ROAD BANGALORE,11 Aug 2026,BLU02188UNCOC +Allopathy,Hospital (Level 2),VAIDYA SHAAM SINGH MEMORIAL NURSING HOME,"NO.55, GANDHI BAZAR, FACING E.A.T STREET, NEAR BHAVANI KALYANA MANTAPA.",19 Dec 2025,BLU01256ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,Dhanvantri Clinic,Kennalu Society Building.Panvapura,31 Mar 2026,MAN00100AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Child Care Clinic,"No 48,Shivaji road,Shivaji nagar, Bengaluru",02 Dec 2026,BLU02687ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,SRI DEVI CLINIC,"BESIDE INDIAN ATM, DEVINAGAR",24 Oct 2027,BEL00394ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHREE VENKATESH CLINIC,MALLAMMA NAGAR MUDHOL,08 Jun 2027,BGK00380AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SAI DEEP ENT CLINIC,OPP KEB BESIDE RAGHAVENDRA TEMPLE MAIN GATE BIDAR,03 Oct 2026,BDR00081ALCOC +Allopathy,Clinic/Polyclinic with Dispensary,PADMANABH PANDIT MEMORIAL CLINIC,"Pandit Compound, Kelaginoor, Honnavar, Uttara-Kannada Dist.",27 Oct 2026,UKA00063ALCWD +Allopathy,Medical Diagnostic Laboratory,DR. LAL PATHLABS LIMITED,"CST NO.3682 , 2 FLOOR, PRASHANTH COLONY, VIDYANAGAR, +HUBLI - 580021",07 Apr 2026,DWR00236ALMDL +Allopathy,Hospital (Level 1A),STAR HOSPITAL,"NO.15/1. 13TH CROSS, HOSAHALLI MAIN ROAD, PADARAYANAPURA, BANGALORE-560025.",13 Apr 2026,BLU01809ALH1A +Allopathy,Clinic/Polyclinic with Dispensary,skin win clinic,"door no, 13-3-31d-4 +1st floor, sri devraja tower +court road, Udupi,",24 May 2026,UDP00132ALCWD +Allopathy,Dental Lab or Clinic,Shre Vinayakaa Dental Clinic,"No. 1199, 1st Floor, 26th Main Rd, Jayanagara 9th Block, Bengaluru, Karnataka 560069",26 Jul 2027,BLU03522ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,SATYARADDI DIABETES THYROID & ENDOCRINE SUPER SPECIALITY CENTER,VANDAKUDARI BUILDING NEAR WATER TANK MAHAVEER ROAD BAGALKOT TQ DIST BAGALKOT,25 Feb 2026,BGK00066ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,N M R SCAN CENTRE ANNEXE WELL WOMENS SCAN CENTRE,"Sona Chambers, Club Road, Hubballi-580020.",07 Apr 2026,DWR00234ALCDS +Allopathy,Medical Diagnostic Laboratory,SHREE VINAYAKA DIAGNOSTIC CENTRE,"RMC ROAD, OPP. PRATHAM GAS AGENCY,GUBBI",29 Jul 2026,TMK00187ALMDL +Allopathy,Hospital (Level 2),KAVERI NURISNG HOME,"1st cross, 3rd main road, ashoka nagara mandym",31 Mar 2026,MAN00105ALHL2 +Allopathy,Medical Diagnostic Laboratory,BIO LINE DIAGNOSTIC CENTRE,"# 3325 / 18, ANNEGUNDI ROAD, 2ND EIDGHA, OPP SDA SCHOOL, MANDI MOHALLA, MYSURU- 570021",26 May 2027,MYS00499ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,VASTRAD CLINIC,"BESIDE GANGA MEDICAL SHOP, WARD NO 12, COMING ROAD, BALLARI",24 Oct 2027,BEL00395AYCOC +Allopathy,Medical Diagnostic Laboratory,SANTHOSH DIAGNOSTIC CENTER,"#114/1 , 3rd MAIN , 9TH CROSS , CHAMRAJPET , BANGALORE-560018",22 Mar 2026,BLU01707ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,THE KIDS CLINIC,"NO.649, 1ST FLOOR, 38TH CROSS, 14TH MAIN, 4TH BLOCK, JAYANAGARAR, BANGALORE-560041.",04 Mar 2026,BLU01601ALCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SRI MALLIKARJUN CLINIC,BUS STAND ROAD MANHALLI,21 Jan 2027,BDR00101HOCOC +Ayurveda,AYUSH Therapy Centre,SRI SAI CLINIC,MALPE CITY CENTRE OPP YELOOR MOGAVEERA SABHA BHAVANA MALPE,24 May 2026,UDP00128AYATC +Allopathy,Hospital (Level 1B),srinivasa speciality hospital,"srinivasa speciality hospital +jakkanahalli,thayamandlu hobli,nelemangla taluk,bangalore rural",01 Aug 2026,BLR00023ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,ESHWARI CLINIC,"VISHWANATHPURAM, NEAR SRP COLONY, BALLARI",12 Jan 2028,BEL00425ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,PANDIT NARNAPPAYYA AYURVEDALAYA,"OPP BUS STAND, MAIN ROAD, BAJPE",12 Jun 2027,DKA01042AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,MARANATHA CLINIC,"Babu Naidu Street, Near K E B Office, Radio Park",13 Jun 2027,BEL00350ALCOC +Allopathy,Clinic/Polyclinic with Observation,SHIVJYOTHI NETHRALAYA & SURGICAL CENTRE,"NO.302 3RD FLOOR, BUILDING NO 403, 2ND MAIN, EAST OF NGEF , KASTURINAGAR MAIN ROAD, DIAGNOPAL OPP SBI BANGALORE-560043",04 Mar 2026,BLU01618ALCWO +Allopathy,Clinic/Polyclinic Only Consultation,NIRALA NEUROPSYCHIATRIC CARE CENTER,"GOVT HOSPITAL ROAD +MANDYA - 571401",19 Apr 2026,MAN00110ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,NANJAPPA CLINIC,"Dr.AVINASH D B +G5, VRUSHABENDRA COMPLEX, +TURUVANUR ROAD,",15 May 2026,CTR00089ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,HOLY CROSS HEALTH CENTRE MARIANAGAR,"MARIANAGAR VILLAGE +KONANOORU +ARAKALGUDU TALUK",24 Jun 2026,HSN00043ALCOC +Allopathy,Hospital (Level 1A),ARAVINDA NURSING HOME,"#1333, 1ST CROSS KABIR ROAD, MYSURU",16 Nov 2026,MYS00167ALH1A +Allopathy,Hospital (Level 1B),SUDARSHAN EYE HOSPITAL,"NEAR BASAVESHWAR CIRCLE,VITHAL UPPAHAR HOTEL BUILDING 1st FLOOR ATHANI",24 Aug 2026,BLG00381ALH1B +Ayurveda,Clinic/Polyclinic Only Consultation,BHUVANA CLINIC,"BAGUR ROAD, CHANNARAYAPATNA",02 Feb 2027,HSN00115AYCOC +Yoga and Naturopathy,AYUSH Therapy Centre,POONJASHRI CLINIC,"SHOP NO. 4, INFRONT OF ARAMBODY PANCHAYATH, ARAMBODY POST AND VILLAGE",28 Mar 2026,DKA00394YNATC +Allopathy,Hospital (Level 1A),SANTRUPTHI FOUNDATION,"123/1,124/1,1ST FLOOR,MAGADI MAIN RD, MACHOHALLI GATE,PIPELINE RD,NEAR MOOKAMBIKA TEMPLE,BENGALURU",09 Mar 2026,BLU01629ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,VIJAY CLINIC,Nehru Gunj Humnabad Road Kalaburagi-585104,06 Mar 2030,GLB01695ALCOC +Allopathy,Dental Lab or Clinic,SMILE CARE DENTAL CLINIC,"FIRST FLOOR, SRINIVASA NURSING HOME, AZAD ROAD, SAKALESHAPURA",05 Oct 2027,HSN00236ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,LATE CHANDRASHEKAR PATIL REVOOR FOUNDATION DIALYSIS CENTRE,"VEERSHAIWA HOSTEL, SEDAM ROAD KALABURAGI-585101",12 Jul 2026,GLB00271ALCOC +Allopathy,Clinic/Polyclinic with Observation,Anjani Hospital,"Hanumantha reddy building, infront of Anjani Pharma, Venkataramanaswamy temple road, Near post office, Malur-563130",07 Aug 2026,KLR00018ALCWO +Ayurveda,Hospital (Level 4)(Teaching),AMRUTHA AYURVEDA MEDICAL COLLEGE AND HOSPITAL,AMRUTHA AYURVEDA MEDICAL COLLEGE AND HOSPITAL BEHIND ONAKE OBAVA STADIUM CHITRADURGA,30 May 2026,CTR00090AYHL4 +Allopathy,Clinic/Polyclinic Only Consultation,DR RAJALAKSHMI V RAO CLINIC,"#17 OLD NO131,FIFITY ROAD HANUMANTHNAGAR,BANGALORE-560085",06 Jul 2026,BLU02064ALCOC +Allopathy,Hospital (Level 2),PRASHANTH HOSPITAL,NH 66 KOPPALANGADI KAPU,29 Jul 2026,UDP00208ALHL2 +Allopathy,Hospital (Level 1B),PATIL CHILDREN HOSPITAL,"SAI COMPLEX, OPP POLICE STATION, ALMEL TQ SINDAGI DIST VIJAYAPUR",09 Apr 2027,BIJ00415ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,Allopathy,"Kaveri Clinic, Railway station Road",05 Sep 2026,MAN00173ALCOC +Allopathy,Hospital (Level 2),VEENA MEDICAL CENTER,"11,IST CROSS 7TH MAIN 2ND STAGE 'D' BLOCK RAJAJINAGAR BANGALORE 560010",03 Aug 2026,BLU02145ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,Synapse Neuro Center,"# 771, 10th main road 34th cross 4th block Jayanagar Bangalore-560011",03 Aug 2026,BLU02164ALCOC +Allopathy,Hospital (Level 1B),DHOTRAD HEALTH AND MATERNITY HOSPITAL,"C5, Basaveshwar Nagar, Gokul Road, Hubballi-30.",24 Jul 2026,DWR00315ALH1B +Allopathy,Hospital (Level 1B),PATIL NURSING HOME,"OPP DESHAMUKH WADE, LAXMI CHOWK, ALMEL TQ SINDAGI DIST VIJAYAPUR",09 Apr 2027,BIJ00416ALH1B +Allopathy,Clinic/Polyclinic with Diagnostic Support,M/s. Sagar Diagnostics,"No. 8/8, B R Ambedkar Main Road, Hebbagodi, Bengaluru-560099",13 Jul 2026,BLU02099ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,SRI SAI CLINIC,"# 2,OLD TELEPHONE BUILDING, OPP ONAMMA TEMPLE, HEBBAGODI, BANGALORE-560099",06 Jul 2026,BLU02062ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Rajrajeshwari Ayur Clinic,"Laxmeshwara, Church Road, Ankola",01 Jun 2027,UKA00142AYCWD +Homeopathy,Clinic/Polyclinic Only Consultation,SRINIVASA HOMEO CLINIC,"Near Vanitha Samaj, Pervaje Road",28 Nov 2026,UDP00482HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,MEDPLUS HEALTH SERVICES PVT LTD,"NO 169, GROUND FLOOR, AREKERE MICO LAYOUT, NEAR VIJAYA BANK, B G ROAD, BANGALORE-560076",05 Jul 2026,BLU02055ALCOC +Allopathy,Dental Lab or Clinic,CARE DENTAL CLINIC,DK COMPLEX UDGIR ROAD BIDAR,03 Dec 2026,BDR00090ALDEN +Allopathy,Diagnostic Imaging Centre,RAAGHU SCANNING CENTRE,"GURU SHREE, 1ST CROSS, CSI LAYOUT, BEHIND GAYATHRI TALKIES AND MALABAR GOLD SHOP, B.H.ROAD, TUMAKURU-572102",29 Jul 2026,TMK00190ALDIC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Bangalore Institute of Respiratory Diseases and Sleep Disorders BIRDS,"No. 3001, 2nd main, 17th Cross Rd, Banashankari Stage II, Bengaluru, Karnataka 560076",24 Sep 2026,BLU02395ALCDS +Allopathy,Hospital (Level 2),MANISH HOSPITAL,"DR PRAKASH NAYAK, 321-1A/9, SHASTRI CIRCLE, KUNDAPURA, UDUPI DISTRICT",29 Sep 2026,UDP00356ALHL2 +Allopathy,Hospital (Level 1A),GOLDEN FUTURE R ALCOHOL AND DRUG TREATMENT AND REHABILITATION CENTER,"NO11, BEHIND LAKSHMI HOSPITAL, MAGADI MAIN ROAD, SUNKADAKATTE, BANGALORE-560091",11 Jul 2026,BLU02084ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SHRI VARAD VINAYAK CLINIC,AT POST KEMPAWAD TQ ATHANI DIST BELAGAVI,30 Jan 2027,BLG00539AYCOC +Allopathy,Hospital (Level 1B),Bahusar Nursing Home,"Old B M Road, Opp New KSRTC Bus Stand, Hunsur",26 May 2027,MYS00487ALH1B +Allopathy,Hospital (Level 3)(Non-Teaching with Super Specialty Services),SANCHALANA HOSPITAL,"#63, SUNDEW COPLEX, M. G ROAD, Opp JSS HOSPITAL, AGRAHARA, MYSORE-570004",15 Dec 2026,MYS00229ALHL3 +Ayurveda,Clinic/Polyclinic Only Consultation,S.N. Pandit Health Care Services,"#184/1, S.N.Pandit Street, Old Agrahara, Mysore-04.",07 Jul 2027,MYS00614AYCOC +Integrated System,Clinic/Polyclinic Only Consultation,SUKRUTHA CLINIC,"NO. 08, 24TH BLOCK, BEHIND TELEPHONE EXCHANGE, JSS LAYOUT, MYSURU",05 Apr 2028,MYS00819ISCOC +Allopathy,Medical Diagnostic Laboratory,AROGYA DIAGNOSTIC CENTRE,"Opp. Magdum Anand Kalyan Mantap, Basavanagar, Haliyal Road, Dharwad",10 Feb 2029,DWR00904ALMDL +Allopathy,Medical Diagnostic Laboratory,S.R.N Diagnostics and Health Care,S.R.N Diagnostics and Health Care,12 May 2027,RMG00086ALMDL +Allopathy,Hospital (Level 2),HARIRAM CHILDRENS HOSPITAL,"R.M.R ROAD,DURGIGIDI,SHIMOGA,577201",23 Dec 2026,SMG00115ALHL2 +Allopathy,Hospital (Level 2),SATHYA SAI ORTHOPAEDIC AND MULTISPECIALITY HOSPITAL,"No.20/2, Bhattarahalli, Old Madras Road, Near RTO, KR Puram, Bengaluru-560049",02 Jan 2027,BLU02829ALHL2 +Allopathy,Clinic/Polyclinic with Diagnostic Support,SANJEEVINI HEALTH CARE CENTRE,BASAVESHWARA TAKIES ROAD THEOSOPHICAL SOCIETY COMPLEX CHITRADURGA,03 Aug 2026,CTR00102ALCDS +Allopathy,Clinic/Polyclinic with Diagnostic Support,RAKSHYA MULTISPECIALITY CLINIC & DIAGNOSTIC CENTRE,"#102, GROUND FLOOR, VIJAYICON APPT, HUSKAR GATE, HOSUR ROAD, ELECTRONIC CITY-2 BANGALORE-560100",03 Aug 2026,BLU02158ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,SAVITHA CLINIC,"NO.4-402-11 JODURASTHE +POST KIUKKUNDOOR",25 Nov 2026,UDP00439ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,GIRIDHAR CLINIC,"DR NINGAPPA SHEGUNSHI +AT POST JAGADAL",28 Mar 2027,BGK00283AYCOC +Ayurveda,Clinic/Polyclinic with Observation,LAVANYA CLINIC,1ST CROSS ASHWINI NAGAR HAVERI-581110,12 Apr 2027,HVR00285AYCWO +Allopathy,Hospital (Level 2),Tanvi Plastic Surgery Centre,"Kuvempu Road, Shimoga",01 Sep 2027,SMG00252ALHL2 +Allopathy,Clinic/Polyclinic with Observation,VAIDYA CLINIC,"# 12TH CROSS, MGS ROAD, NANJANGUD",14 Feb 2029,MYS00972ALCWO +Homeopathy,Clinic/Polyclinic Only Consultation,New Line Clinic,"Mothinagara Mohalla, Balageri 2nd, Mehaboobnagara, railway gate, Ramanagara-562159",10 Oct 2026,RMG00037HOCOC +Allopathy,Clinic/Polyclinic with Dispensary,POLY CLINIC,"COMFORT TOWERS, UDUPI",17 Aug 2026,UDP00265ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,SHINE ORTHO FRACTURE & FAMILY CLINIC,"No 20/2 Site no 1 shop no 3 , building no 1, Chikkabanavara old railway station road , Opp to masthan saab land(Basappa garden) Bangalore 560090.",23 Aug 2026,BLU02244ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,MARNE ORTHO CLINIC,"FIRST FLOOR, SRIRAM ARCADE OPP. HEAD POST OFFICE UDUPI",17 Aug 2026,UDP00266ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,GIRISHEKHAR SONO SCAN CENTER,"VAKIL CHAWL, GADAG",13 Jan 2027,GDG00084ALCDS +Allopathy,Clinic/Polyclinic with Diagnostic Support,M/s. JP Health Care and Diagnostics,"No. 5, SRS Complex, NGEF Layout, Opp. GM Hospital, Nagarabhavi, Bengaluru- 560072",05 Jan 2027,BLU02840ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,Jeevan Jyothi Clinic,"Belgaum Road, Haliyal",01 Jun 2027,UKA00140ALCOC +Ayurveda,AYUSH Therapy Centre,ANUGRAHA PANCHAKARMA AND YOGA CENTRE,BIRTHI BRAHMAVARA,04 Mar 2027,UDP00600AYATC +Allopathy,Clinic/Polyclinic Only Consultation,NAMITA EYE CLINIC,STATION ROAD INDI DIST VIJAYAPUR,30 Apr 2027,BIJ00426ALCOC +Allopathy,Hospital (Level 1B),Shiva Nursing Home,"No 20 , Old No 310 , 7TH MAIN ROAD LAKKASANDRA EXTENSION , ADUGODI POST , BANGALORE- 560030",05 Jan 2027,BLU02864ALH1B +Allopathy,Hospital (Level 1B),OFFSPRING MATERNITY and CHILD CARE,"no.5/1,4th main, MRCR layout, vijaynagar, near veeresh theatre, bangalore",13 Feb 2027,BLU03025ALH1B +Ayurveda,Hospital (Level 4)(Teaching),POORNIMA AYURVEDIC MEDICAL COLLEGE HOSPITAL AND RESEARCH CENTRE,"SY NO 1163, MPL NO 4-4-409, ANUSHAPATIL NAGAR, MANTRALAYA ROAD, RAICHUR",04 Jan 2027,RCR00035AYHL4 +Allopathy,Hospital (Level 2),M/s SHAHAPUR SHISHU HOSPITAL,"GOLGERI COMPLEX, GANESH NAGAR, B.B ROAD SHAHAPUR",03 Jan 2027,YDR00395ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,SRI SAINATHA CLINIC,"SRI SAINATHA CLINIC, +OPPOSITE K.E.B OFFICE, +BANAVARA ROAD, +PANCHANAHALLI, +577182",31 Mar 2027,CKM00090AYCOC +Allopathy,Medical Diagnostic Laboratory,SAGAR DIAGNOSTIC LABORATORY,OPP GOVT HOSPITAL T NARASIPURA,24 Mar 2027,MYS00386ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,Shrinivas Clinic,"Shrinivas Clinic, Vagat Post, Jadigenahalli Hobli, Hoskote Taluk, Makanahalli",02 Aug 2028,BLR00430AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Dr Satish Kinagi Clinic,PAL complex opp karnataka radio shop no 26/28 opp city bus stand gulbarga,03 Apr 2027,GLB00509ALCOC +Allopathy,Dental Lab or Clinic,dr dodamani dental and orthodontic clinic,"shop no.1, 1st floor B-wing, diamond corner complex, sangam circle, line bazar, dharwad-580001",08 Oct 2027,DWR00507ALDEN +Allopathy,Dental Lab or Clinic,MANITHAL CLINIC,"MANITHAL CLINIC, NEAR GANDHI CIRCLE, MEDEHALLI ROAD, CHITRADURGA-577501",30 Dec 2026,CTR00166ALDEN +Allopathy,Clinic/Polyclinic Only Consultation,DEEPAK CLINIC,"WARD NO 07, ASHWINI LAYOUT, CHINTHAMANI",04 Jan 2027,CBR00070ALCOC +Allopathy,Hospital (Level 1B),QADRI HOSPITAL,"Tippu Nagar, Nekar Nagar Road, Old Hubli, Hubballi.",21 Dec 2026,DWR00414ALH1B +Allopathy,Clinic/Polyclinic with Diagnostic Support,SURYA DIAGNOSTICS AND SCANNING CENTRE,"NO 167, 8TH MAIN ROAD, BEML LAYOUT 1ST STAGE, BASAVESHWARANAGAR, BANGALORE-560079",05 Jan 2027,BLU02858ALCDS +12345678910...,1,2,3,4,5 +Ayurveda,Clinic/Polyclinic with Dispensary,SRINIDHI CLINIC,"New Mandli, N.T.Road, Shimoga.",01 Sep 2027,SMG00273AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,CHAITANYAA CLINIC,"Anna Nagar Main Road, +Shimoga.",18 Apr 2028,SMG00384AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Alva Cliniv,"Oppt to Kankanady market, Kankandy , Mangalore -575002",08 Sep 2027,DKA01203ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,PRASHANTH CLINIC,"NEAR CHOKKABETTU CIRCLE, SURATHKAL, MANGALORE",10 Aug 2027,DKA01184ALCOC +Homeopathy,Clinic/Polyclinic with Dispensary,SUHANS HEALTH CARE CLINIC,GRAND CITY THOKOTTU,19 Jun 2028,DKA01679HOCWD +Allopathy,Hospital (Level 3)(Non-Teaching with Super Specialty Services),Ratnagarbha Hospital,"12-7-197, Siyatalab, Next to Suddimoola Press",16 Nov 2027,RCR00197ALHL3 +Allopathy,Clinic/Polyclinic with Diagnostic Support,SHREERAKSHA HEALTH AND CLINICAL LAB,3/B SHREE RAKSHA GOVT JUNIOR COLLEGE ROAD NEAR KEMPEGOWDA CIRCLE,25 Aug 2027,BLU03604ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,SANTOSH CLINIC,OPP APMC YARD,09 Jun 2027,BIJ00466AYCWD +Allopathy,Clinic/Polyclinic with Diagnostic Support,MANNAKHELLI POLYCLINIC,PHOBHA COMPLEX MAIN ROAD MANNAKHELLI BIDAR,31 Jul 2027,BDR00177ALCDS +Allopathy,Clinic/Polyclinic Only Consultation,REVANKARS SKIN CLINIC,"NO 324/1 , 4TH MAIN , 6TH CROSS , NRUPATHUNGA NAGAR , JP NAGAR 7TH PHASE , BANGALORE-560078",10 Sep 2028,BLU05426ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,JANATHA CLINIC,"Khazi Mohalla, Bhadravathi taluk",30 Dec 2027,SMG00314AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,Raksha clinic,"Opposite to Town Police station , Market Road , Chikkamagaluru-577101",05 Aug 2027,CKM00184ALCOC +Ayurveda,Clinic/Polyclinic with Observation,SHREE BHAVANI MULTISPECIALITY HOSPITAL,OPP BUS STAND MUDDEBIHAL DIST VIJAYAPUR,22 Jul 2027,BIJ00495AYCWO +Allopathy,Hospital (Level 1A),SHRI RAM HOSPITAL,"SY.NO 56/A1, KHATA NO 123/2, MADANAYAKANAHALLI, NESR BUS STOP, TUMKUR ROAD, DAANAPURA HOBIL, BANGALORE NORTH- 562162.",16 Aug 2027,BLU03576ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,Shri Ganesh Clinic,"Marshettyhalli, Kallihal Circle, +Marshettyhalli, Bhadravathi tq",12 Jul 2028,SMG00432AYCOC +Homeopathy,Clinic/Polyclinic with Dispensary,SANVI CLINIC,"Lions School Road, Bankapur-581202",01 Mar 2028,HVR00479HOCWD +Homeopathy,Clinic/Polyclinic Only Consultation,Shri Raghavendra Clinic and Homoeo Care Centre,"Dr.Shivarajkumar S humbi +Nadivan Oni Ingalhalli",24 Jul 2026,DWR00333HOCOC +Homeopathy,Clinic/Polyclinic Only Consultation,ANAND CLINIC,AT/POST-SHIRAHATTI TQ.ATHANI DT.BELAGAVI-591304,19 Mar 2026,BLG00258HOCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,FORTIS HOSPITALS LIMITED,"154/9,Bannerghatta Road,OPP IIM-B, Bangalore-560076",26 Aug 2026,BLU02275ALSSH +Allopathy,Clinic/Polyclinic Only Consultation,ANKUR CLINIC,ANANYA PLAZA LG-02 OPP MARUTI MANDIR PIPELINE GANESHPUR ROAD VIJAYNAGAR BELAGAVI,29 Jul 2027,BLG00757ALCOC +Allopathy,Clinic/Polyclinic with Observation,VASU CLINIC,K E B ROAD N R Extension CHINTAMNI,04 Jan 2027,CBR00084ALCWO +Homeopathy,Clinic/Polyclinic with Dispensary,SHIVA HOMOEO CLINIC,"No.580/8, 75th B Cross, 6th Block, Rajajinagar, Bengaluru",24 Mar 2026,BLU01726HOCWD +Ayurveda,Hospital (Level 1A),Sri Dhanvantari Arogyashram Trust,"B.N.Road, NANJANGUD",29 Jan 2030,MYS01409AYH1A +Ayurveda,Clinic/Polyclinic Only Consultation,JAGADEESH CLINIC,"Gopanakoppa Main Road, Hubballi-580023.",24 Jul 2026,DWR00330AYCOC +Allopathy,Diagnostic Imaging Centre,SRI VISHNU IMAGING AND DIAGNOSTICS,"C/O K SHARADHA , 117/562 , B M ROAD , RAMANAGARA , SH 17 , RAYARADODDI, RAMANAGARA",10 Oct 2026,RMG00039ALDIC +Allopathy,Clinic/Polyclinic with Observation,Hebri Eye Hospital,"Ground floor , Spathika Plaza , Kuchur Road , Hebri",20 Dec 2026,UDP00496ALCWO +Homeopathy,Medical Diagnostic Laboratory,SHIVALLI DIAGNOSTIC CENTRE,"MELUKOTE ROAD, NEAR SYNDICATE BANK, SHIVALLI MANDYA",23 May 2026,MAN00126HOMDL +Allopathy,Specialty / Super-Specialty Specific Hospital,MAAX SUPER SPECIALTY HOSPITAL,"RATHNAMMA MADHAV RAO ROAD,PARK EXTENSION SHIMOGA 577 201, KARNATAKA STATE",25 Oct 2026,SMG00073ALSSH +Allopathy,Medical Diagnostic Laboratory,SHASHI DIAGNOSTIC LAB,P.M. PATIL HOSPITAL SECOND FLOOR TELASANG HOSPITAL BUILDING NEAR RURAL POLICE STATION LAXMINAGAR BAGALKOT,17 Jun 2026,BGK00109ALMDL +Allopathy,Clinic/Polyclinic with Diagnostic Support,Udayaravi orthopedic & diagnostic center,"opposite district hospital, post office road, Gandhinagar",06 Oct 2026,TMK00248ALCDS +Allopathy,Hospital (Level 1A),ISLETS DIABETIC HOSPITAL,"Gopala Gowda Extension, +Near Dwaraka Convention Hall, +Sagar Road, Shimoga.",22 Dec 2026,SMG00093ALH1A +Allopathy,Dental Lab or Clinic,Shreekara Dental Clinic,"No 44, 2nd House - Ground Floor, Beside BNB Apartment, Achar Layout, Hagadur Colony, Immadihalli Main Road, Whitefield",18 Sep 2027,BLU03741ALDEN +Allopathy,Dental Lab or Clinic,ORACLE MULTISPECIALITY DENTAL CARE,"No.23, Sri Sai Plaza, 1st Floor, Sanjeevini Nagar, Kodigehalli Main Road, Bengaluru - 560092",18 Apr 2029,BLU07400ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,HITHA AYURVEDICS,"2-136 Giriyanna Shetty complex Market road +Kasaba Karkala Udupi",13 Jan 2027,UDP00518AYCWD +Allopathy,Dental Lab or Clinic,JANANI DENTAL CLINIC,"SARVOTHAM COMPLEX, OPP BUS STAND, SHIRVA, UDUPI -574116",08 Sep 2026,UDP00324ALDEN +Ayurveda,Clinic/Polyclinic Only Consultation,RENEW FAMILY CLINIC & WELLNESS CARE CENTER,"4TH CROSS, 7TH MAIN, VIVEKNAGAR POST, BANGALORE-560047.",24 Sep 2026,BLU02397AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Suraksha clinic,"Pajappalla,Mupperia village, Balila Post",12 Dec 2026,DKA00600AYCOC +Allopathy,Hospital (Level 2),SHRI BALAJI HOSPITAL,NEAR PAMPA CIRLCE MUKTIMANDIR ROAD AT POST LAXMESHWAR,17 Aug 2026,GDG00040ALHL2 +Allopathy,Diagnostic Imaging Centre,SHANKARA DIAGNOSTICS,"CHANDRAMOULI COMPLEX, GROUND FLOOR, B.H.ROAD, TIPTUR TALUK, TUMKUR DISTRICT -572201",26 Jul 2026,TMK00179ALDIC +Allopathy,Specialty / Super-Specialty Specific Hospital,SKKMT SANKARA EYE HOSPITAL,"HARAKERE, THIRTHAHALLI ROAD",25 Oct 2026,SMG00066ALSSH +Allopathy,Diagnostic Imaging Centre,Kadaba Scanning Center,"Yoga Keshma Building, Kadaba, Puttur Taluk",10 Mar 2027,DKA00666ALDIC +Allopathy,Hospital (Level 2),R C HOSPITAL,"#484/A, IDEAL HOME TOWNSHIP +18TH MAIN ROAD, RAJARAJESWARINAGAR +BANGALORE",01 Nov 2026,BLU02559ALHL2 +Allopathy,Hospital (Level 2),SHIVASAI NURSING HOME,Shop No 3-4-514/2/3 opp Bus Stand Chincholi,22 Aug 2026,GLB00306ALHL2 +Allopathy,Hospital (Level 2),AKSHAY HOSPITAL,"Opp Gupta pentrol Bank, P B Road Ranebennur",08 Sep 2026,HVR00203ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,Shivaprasad Nethralaya,"No. 744, opposite to Mangala hospital, sampige road, KR Puram, Hassan 573201",24 Jan 2027,HSN00096ALCOC +Allopathy,Diagnostic Imaging Centre,SHREE CHAKRA DIAGNOSTICS,"Channekeshava Gowda Street, Opp . Govt Hospital Belur",02 Feb 2027,HSN00105ALDIC +Ayurveda,Clinic/Polyclinic with Dispensary,RAGAHVENDRA CLINIC,SHIVAPURA KARKALA,02 Sep 2026,UDP00282AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,SRI VENKATESHWARA CLINIC,TILAK NAGAR MAIN ROAD SHIVAMOGGA,23 Dec 2026,SMG00119ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SAHITYA CLINIC,MARKHANDESHWAR COMPLEX OPP VEERBHADRESHWAR ITI COLLEGE HUMNABAD BIDAR,05 Apr 2029,BDR00327AYCOC +Allopathy,Hospital (Level 1A),SHRI SAI VISHWAS HOSPITAL,Basaveshwar circle Jamkhandi,16 Dec 2026,BGK00218ALH1A +Allopathy,Hospital (Level 1A),TALWADE HOSPITAL,"Opp. Heeralal Pannalal High School, Bidar",01 Sep 2026,BDR00071ALH1A +Allopathy,Clinic/Polyclinic with Dispensary,SHALOM CLINIC,"Nagara Road, 2nd Bridge, +Masthikatte, Hosanagara tq.",04 Apr 2027,SMG00175ALCWD +Allopathy,Clinic/Polyclinic Only Consultation,MOTHER TERESA HOSPITAL,"Kannamangala palya, Kasaba hobli, devanhalli",03 Apr 2027,BLR00147ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Lakshmi Clinical Laboratory,High School Road Jakkanahalli .V. Pandavapura,01 Sep 2026,MAN00157ALCDS +Allopathy,Hospital (Level 2),RITI LIFECARE HOSPITAL,M S CHANNAL BUILDING JAYALAXMINAGAR MAHALINGAPUR,03 Oct 2026,BGK00167ALHL2 +Homeopathy,AYUSH Therapy Centre,AKSHAYA HOMOEOPATHY CLINIC,"No 5 – 224/5, Ground Floor, +Star Commercial Complex, +Kaikamba, Post Kinnikambla, +Mangalore Taluk",31 Mar 2027,DKA00761HOATC +Ayurveda,Clinic/Polyclinic Only Consultation,New Sanjeevini Clinic,"H.D. Kote Road, D. Salundi, Dhanagalli Post, Mysore Taluk.",07 Jul 2027,MYS00597AYCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Sri Sangameshwara Clinic,"Market road, Kollegala Taluk",06 Jul 2028,CNR00073AYCOC +Allopathy,Hospital (Level 1B),N M BALASING MEMORIAL HOSPITAL,GULAM HUSSAIN GALLI NEAR JUNIOR COLLEGE VIJAYAPUR,21 Jan 2027,BIJ00336ALH1B +Homeopathy,Clinic/Polyclinic with Dispensary,Sharma Clinic,"Sharma Clinic, TSS Road, Sirsi UK",01 Jun 2027,UKA00169HOCWD +Allopathy,Hospital (Level 1B),SPG HOSPITAL AND DIAGNOSTIC CENTER,"SY No 88/10 , SLV Arcade, 4th floor, Next to HP petroleum pump, Thirumalashettyhalli Cross, National Highway 207, Thirumalashettyhally, Bengaluru, Kar",03 Mar 2027,BLR00140ALH1B +Allopathy,Dental Lab or Clinic,SYHADRI DENTAL CLINIC,"SALAGAME ROAD, SYHADRI CIRCLE, HASSAN.",16 Mar 2027,HSN00123ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,Masti Clinic,"Main Road, Ankola",26 May 2027,UKA00137AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,Friends Health Care Centre,"100 ft road, Gopala Gowda badavane, Oppoite vishal mart, Near Alkola circle, Shivamogga",19 Sep 2027,SMG00279ALCOC +Allopathy,Hospital (Level 2),Sathya Sai Annapoorna Nursing Home,"Court Road,Puttur Kasaba village,Puttur Taluk,Puttur D.K.,Karnataka",15 Mar 2027,DKA00686ALHL2 +Allopathy,Hospital (Level 2),SHIFA HOSPITAL,"Tippu Sultan Circle, NHT Mill Road, Nargund, Dist. Gadag.",28 Jan 2027,GDG00097ALHL2 +Allopathy,Medical Diagnostic Laboratory,ADITYA CLINICAL LABORATORY,"Near Old Bus Stand, Tappula Chnappa Building, Beside Eshwar Temple, Kamalapur.",19 Jul 2029,VIJ00326ALMDL +Allopathy,Hospital (Level 1A),shri krishna hospital,"1770/1 beside govt kannada school no 9 , kelkarbagh belagavi",27 Mar 2028,BLG01109ALH1A +Allopathy,Clinic/Polyclinic with Diagnostic Support,Hema Clinic,"388, 5th Main, Vijaya Bank Layout, Bengaluru",18 Dec 2028,BLU06183ALCDS +Allopathy,Dental Lab or Clinic,DENTLIFE,"GROUND FLOOR, WEST WING, R.R COMPLEX, MELKAR JUNCTION, BANTWAL",24 Jan 2028,DKA01401ALDEN +Allopathy,Hospital (Level 1A),SURAKSHA POLY CLINIC SURGICARE CENTRE,T R NAGARA CHALLAKERE,14 Feb 2027,CTR00178ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,Mohan Clinic,KM Road Chikmagalur,03 Mar 2027,CKM00084ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,DURGAMBIKA CLINIC,"Ganapati Nagar, Shirwad, Karwar, U.K District",20 Mar 2028,UKA00304AYCWD +Ayurveda,Clinic/Polyclinic with Dispensary,Abhaya Chikithsalaya,Abhaya Chikithsalaya Main Road Kollur Kundapura Taluk,02 Mar 2027,UDP00595AYCWD +Allopathy,Hospital (Level 1B),INDUMATI DIABETIC AND HEART CARE CENTRE,"H.No.8, Keshav Nagar, SBI Colony, Dharwad.",07 Oct 2027,DWR00488ALH1B +Allopathy,Hospital (Level 2),SANMEET HOSPITAL,SANMEET HOSPITAL NEAR WOMENS COLLEGE CHIKODI,31 Jan 2027,BLG00583ALHL2 +Ayurveda,Clinic/Polyclinic Only Consultation,SURAKSHA CLINIC,"SURAKSHA CLINIC, MAIN ROAD, MATHOD, HOSADURGA TALUK, CHITRADURGA DISTRICT 577533",14 Feb 2027,CTR00179AYCOC +Homeopathy,Clinic/Polyclinic Only Consultation,SHRI GURU DATTATREYA CLINIC,ANJANEY NAGAR NEAR SHRI DATTA MANDIR M M EXTENSION,08 Feb 2027,BLG00613HOCOC +Allopathy,Clinic/Polyclinic Only Consultation,RE MODAL YOURSELF SKIN HAIR WEIGHT LOSS CLINIC,"NO 54, UNION BANK, OF INDIA BUILDING, OPP. JANAPRIYA APARTMENT, CHIKKASANDRA, HESARAGHATTA MAIN ROAD, BANGALORE-560090",12 Jun 2027,BLU03432ALCOC +Allopathy,Clinic/Polyclinic Only Consultation,Childrens Clinic,CPC Plaza Main Road Puttur,15 Mar 2027,DKA00690ALCOC +Allopathy,Dental Lab or Clinic,MEENAKSHI DENTAL CARE,"# 86/ A , HMS Building , Kammanahalli main road, Bangalore 560084",11 Feb 2027,BLU03016ALDEN +Allopathy,Hospital (Level 1B),UDOSHI HOSPITAL,PLOT NO.291 SY NO.351 PRABHUDEV SWAMIJI ROAD RAMATIRTH NAGAR BELAGAVI TQ/DT.BELAGAVI-590016,29 Jul 2027,BLG00725ALH1B +Allopathy,Hospital (Level 2),SHRINIVAS NURSING HOME,"SHRINIVAS NURSING HOME +BASAVESHWAR CIRCLE MAHALINGAPUR-587312",17 Jun 2027,BGK00406ALHL2 +Allopathy,Hospital (Level 2),Kale orthopaedic centre,"heramba plaza, B R Ambedkar road, Behind SOOCH show room, opp. BIMS. Belgavi 590019",07 Mar 2027,BLG00626ALHL2 +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DHANVANTHARI CLINIC,GARADIMAJAL TENKANIDIYOORU,31 Mar 2027,UDP00657AYCWD +Allopathy,Hospital (Level 1B),Fr L M Pinto Health Centre Charitable Trust,Badyar Padangady P O Belthanagady taluk Dakshina Kannada D K,17 Mar 2027,DKA00727ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,SHREE SAI CLINIC,"SRA COMPLEX, Sulebhavi Cross, AMINAGAD",07 Jun 2027,BGK00379ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,Ashwin Clinic,"Ashwin Clinic Near LIC Circle Navanagar, Bagalkot",03 Apr 2027,BGK00339AYCOC +Allopathy,Hospital (Level 2),MANIPAL HOSPITALS PRIVATE LIMITED,"SURVEY NO.22/1B, BASHETTIHALLI VILLAGE,KASABAHOBLI,DODDABALLAPUR,BANGALORE RURAL",15 Feb 2027,BLR00134ALHL2 +Allopathy,Hospital (Level 3)(Non-Teaching with Super Specialty Services),NAYANAKUMAR S MULTISPECIALITY HOSPITAL,"CA 6, 3RD MAIN ROAD, NEAR BY NETHAJI CIRCLE DATTAGALLI, MYSURU - 570022",10 Jan 2027,MYS00296ALHL3 +Allopathy,Hospital (Level 2),SHIVKRUPA HOSPITAL,2700 OPP MIRAJE PETROL PUMP K C ROAD CHIKODI 591201,31 Jan 2027,BLG00584ALHL2 +Allopathy,Hospital (Level 1B),RAMLEELA HOSPITAL AND MATERNITY HOME,"N.H-66, Gandhi Nagar, Kumta, U.K District",24 May 2027,UKA00125ALH1B +Allopathy,Dental Lab or Clinic,ANAND MULTISPECIALITY DENTAL CLINIC,"F-3, Vinayak Complex, Bailappanavar Nagar, Hubballi.",22 Oct 2027,DWR00561ALDEN +Allopathy,Diagnostic Imaging Centre,VEDA SCANS AND DIAGNOSTICS,NO 3447 WARD NO 5 NEAR SHIVAJI CIRCLE MALLAMMA NAGAR,03 Apr 2027,BGK00332ALDIC +Allopathy,Hospital (Level 1B),NIMBANNAVARS ADVANCED MATERNITY HOSPITAL,"Behind Bus Stand, Church Road, Kalghatagi.",10 Mar 2027,DWR00435ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,Samruddi Clinic,"#2030/1, 8th Cross, Ward No. 32, M.C.C.'B' Block, Davangere",15 Mar 2028,DVG00436ALCOC +Integrated System,Clinic/Polyclinic with Dispensary,SHARADA CLINIC,"Bharathi Street, Near police Station Sringeri 577139",02 Jun 2027,CKM00136ISCWD +Homeopathy,Clinic/Polyclinic Only Consultation,Shri Kedar Clinic,"House No.123 Navi Galli, Halaga.",07 Dec 2025,BLG00047HOCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,Sun Orthopaedic Centre,"#1287,3rd cross, BEL layout, 1st Block, Vidyaranyapura",15 Oct 2025,BLU00838ALCDS +Ayurveda,Clinic/Polyclinic Only Consultation,SRI KALLESHWARA CLINIC,#483/2 ANJANEYA TEMPLE ROAD MAYAKONDA AT POST,29 Aug 2025,DVG00013AYCOC +12345678910...,1,2,3,4,5 +Ayurveda,Clinic/Polyclinic Only Consultation,MRUTYUNJAYA CLINIC,NEAR HANUMAN TEMPLE LOKAPUR,18 Jul 2027,BGK00455AYCOC +Allopathy,Medical Diagnostic Laboratory,HEALTH CARE DIAGNOSTIC LABORATORY,"148, Adishakti Building, Sambhaji Road, +Khasbag, Belagavi",11 Dec 2027,BLG00922ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,SHRI BASAVESHWAR CLINIC KENDUR,AT KENDUR POST KUTAKANAKERI TA BADAMI DIST BAGALKOT 587201,19 Sep 2027,BGK00483AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,BUDIHAL CLINIC,BUDIHAL CLINIC GADDANAKERI,24 Jun 2029,BGK00769AYCWD +Allopathy,Blood Bank,M/s Dharwad Blood Bank,No- 9925/3 1st floor Sukruth building OPP to K C park Main gate P B road Dharwad,02 Nov 2028,DWR00822ALBLB +Allopathy,Medical Diagnostic Laboratory,CITY LABORATORY,"Kn1092/09/10/11,Shop no 2,Ground Floor +Maruthi Nagar, Bagalur Main Road, Sarjapura, Bangalore -562125",04 Apr 2027,BLU03253ALMDL +Allopathy,Hospital (Level 1A),Anupama Hospital,"72/3CIIQ Road, BEL Layout, 2nd Phase, Near Karnataka Bank, Bangalore-560091",29 Mar 2027,BLU03205ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,BASAVASHREE CLINIC,"Purohit Nagar, Kalghatagi Road, Dharwad.",22 Oct 2027,DWR00557AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SAI CLINIC,"KOLACHALAM COMPOUND, OPP. OLD KSRTC BUS STAND, BALLARI",13 Jun 2027,BEL00336ALCOC +Allopathy,Medical Diagnostic Laboratory,CLEVERGENE BIOCORP PVT LTD,"617, 5TH MAIN ROAD , OMBR LAYOUT , BANASWADI, BANGALORE-560043",26 Jan 2027,BLU02936ALMDL +Allopathy,Hospital (Level 2),kaveri memorial hospital,mahaveer road. kalasa 577124,15 May 2027,CKM00106ALHL2 +Ayurveda,Hospital (Level 4)(Teaching),Shri J G Cooperative Hospital Societys Ayurvedic Medical College and Hospital,"Dr. Gangadhar Nagar , Ghataprabha",04 Aug 2027,BLG00817AYHL4 +Ayurveda,Clinic/Polyclinic Only Consultation,Prashanthi Clinic,"TM Road, Rangenahalli",31 Mar 2027,CKM00093AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,ANUGRAHA DIABETES AND ENDOCRINOLOGY CENTER,"No.2-599/1/A, Opp. big Bazar, Jagat. Kalaburagi",09 Aug 2027,GLB00607ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,KALAKALESHWAR CLINIC,NEAR POST OFFICE AT POST GUDUR SC,27 Jan 2027,BGK00245AYCWD +Allopathy,Hospital (Level 1B),RURAL INDIA HEALTH PROJECT,"Ammathi, Siddapur Road, +Virajpet Taluk",03 Jul 2027,KDG00114ALH1B +Allopathy,Medical Diagnostic Laboratory,BLESSING CLINICAL LABORATORY,"BASAVARADDI COMLEX, BELLATTI",13 Jan 2027,GDG00086ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,SHREE HARI DIABETES FOUNDATION,"# 176, HARIKRUPA ANIKETHANA ROAD, 1ST CROSS, KUVEMPUNAGAR, MYSORE - 570023",09 May 2027,MYS00422ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Meera healthcare,"Meera health-care clinic, Main road Bajagoli, karkala TQ",05 Apr 2027,UDP00681AYCWD +Allopathy,Hospital (Level 1A),Cure well Hospital,1-7-5C Khuba plot jajee Layout Kalaburagi,21 Feb 2027,GLB00475ALH1A +Allopathy,Hospital (Level 1A),M/s MANAGULI HOSPITAL,Near Vidhyaranya School Shahapur,06 Jan 2027,YDR00412ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,SRI VEERABHADRASWAMY CLINIC,"SHOP NO 1, AIRPORT ROAD, BAGALUR VILLAGE AND POST BANGALORE NORTH - 562149.",14 Feb 2028,BLU04251AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,UDUPA CLINIC,HALLADI HARKADI KUNDAPURA TALUK UDUPI DISTRICT,04 Mar 2027,UDP00597AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,NISARGA CLINIC,OPPOSITE SRI VEERAPULIKESHI BANK GANACHARI COMPLEX BADAMI,29 Mar 2027,BGK00322AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,CHETHANA CLINIC,"# 2151, AKBAR ROAD, MANDI MOHALLA, MYSORE - 570001",26 May 2027,MYS00471ALCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SRI KUMAR VIJAY POLY CLINIC,Near Bus Stop Kerur,16 Aug 2027,BGK00472AYCOC +Allopathy,Hospital (Level 1A),Mahaveera Medical Centre,"Near RH Centre, Bolwar, Puttur",31 Mar 2027,DKA00767ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,RAO S MEDICAL AND DIABETIC CENTRE,"NO.699, 7TH MAIN, CBI ROAD, HMT LAYOUT, R T NAGAR, BANGALORE-560032.",01 Mar 2027,BLU03093ALCOC +Allopathy,Medical Diagnostic Laboratory,HANUMAN CLINICAL LABORATORY,"Shop No.2, Hanuman Club, Opp. Govt Hospital Road,, Banavara town, Arsikere",15 Jun 2027,HSN00196ALMDL +Ayurveda,Clinic/Polyclinic Only Consultation,ASHWINI CLINIC,Kamatagi,17 Jun 2027,BGK00412AYCOC +Allopathy,Medical Diagnostic Laboratory,WELLBE HEALTH CARE,"GROUND FLOOR, VINAYAKA ARCADE, NEAR JEPPU MARKET, MANGALORE",12 Jun 2027,DKA01033ALMDL +Allopathy,Medical Diagnostic Laboratory,TRUSTLAB DIAGNOSTICS PVT LTD,"NO.12, BBMP NO.427/371/371, 4TH FLOOR, ABOVE FOSTER HEALTH CARE, PANATHUR MAIN ROAD, PANATHUR, BANGALORE-560103.",09 Jan 2027,BLU02880ALMDL +Ayurveda,Clinic/Polyclinic with Dispensary,Nisarga Hospital,"Main road, Rampur",08 Jun 2027,BGK00389AYCWD +Allopathy,Hospital (Level 2),KALBURGI HOSPITAL,MAHAVEER ROAD BAGALKOT,29 Mar 2027,BGK00326ALHL2 +Allopathy,Hospital (Level 2),Ashwini Hospital,"Shivasagar Arcade,Ground Floor, 1264 Ramlingkhind Galli, Belgavi",29 Jul 2027,BLG00738ALHL2 +Homeopathy,Clinic/Polyclinic Only Consultation,Basava Clinic,"TP Complex ,Opposite IB, Ambedkar Circle Devadurga, Pin Code- 584111",13 Mar 2027,RCR00064HOCOC +Allopathy,Hospital (Level 1A),PRASHANTHI HOSPITAL,"NEAR TELEPHONE EXCHANGE, +LAKSHMEESHA NAGARA, +CHIKKAMAGALURU",03 Mar 2027,CKM00083ALH1A +Allopathy,Medical Diagnostic Laboratory,BIO LINE LABORATORY LIFE CARE DIAGNOSTICS,"BIO LINE LABORATORY LIFE CARE DIAGNOSTICS, HEBBAR COMPLEX, SHASTRI CIRCLE,KUNDAPURA-576201",18 May 2027,UDP00683ALMDL +Allopathy,Specialty / Super-Specialty Specific Hospital,TRUE LIFE SPECIALITY HOSPITAL,"NO. 188, VIVEK COMPLEX, NAGARBHAVI, 2ND STAGE, 80FT RING ROAD, BENGALURU - 560070",24 Feb 2027,BLU03073ALSSH +Homeopathy,Clinic/Polyclinic Only Consultation,NUGGANATTI CLINIC,DR NUGGANATTI CLINIC WADDIGERI BUILDING MAIN ROAD NARGUND,21 Nov 2027,GDG00157HOCOC +Ayurveda,Clinic/Polyclinic Only Consultation,SHIVA AYURVEDIC CLINIC,BEHIND VASAVI TEXTILE PETE ARKALGUD ARKALGUD TALUK,24 Jan 2027,HSN00088AYCOC +Allopathy,Hospital (Level 1A),SHANTHI HOSPITAL AND RESEARCH CENTER PVT.LTD.,"#307,40TH CROSS,JAYANAGAR 8TH BLOCK,BANGALORE-560070",31 Aug 2028,BLU05373ALH1A +Allopathy,Clinic/Polyclinic Only Consultation,SRI VINAYAKA NEUROGY AND REHABILTATION CENER,BESIDES VIJAYWANI NEWS PAPER OFFICE OLD JEWERGI ROAD KALABURGI,02 Aug 2028,GLB00800ALCOC +Ayurveda,Clinic/Polyclinic with Dispensary,Ashwini Clinic,"At - Agadi, Tq - Haveri",19 Jul 2027,HVR00385AYCWD +Allopathy,Hospital (Level 1B),K M C HOSPITAL,OPPOSITE ESSAR PETROL PUMP HALYAL ROAD ATHANI TQ.ATHANI DT.BELAGAVI-591304,07 Mar 2027,BLG00622ALH1B +Homeopathy,Clinic/Polyclinic Only Consultation,SADA CLINIC,MASHA ALLAH GREEN HEIGHTS APARTMENT SHOP NO.19 MAIN ROAD SHAHU NAGAR BELAGAVI TQ/DT.BELAGAVI-590010,08 Feb 2027,BLG00594HOCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,EVEN HEALTHCARE PRIVATE LIMITED,"GROUND FLOOR, 311, 6TH MAIN ROAD, INDIRANAGAR, BANGALORE-560038.",04 Jan 2027,BLU02836ALCDS +Ayurveda,Clinic/Polyclinic with Dispensary,ANUGRAHA AYURVEDIC CLINIC,NEAR AKASHAVANI BRAHMAVARA,18 May 2027,UDP00695AYCWD +Homeopathy,Clinic/Polyclinic Only Consultation,JANGU CLINIC,KACHERI ROAD NEAR TASHILDAR OFFICE BELAGAVI TQ/DT.BELAGAVI-590002,08 Feb 2027,BLG00595HOCOC +Allopathy,Dental Lab or Clinic,SHAMANTH DENTAL CLINIC,"T.B. ROAD, SIDLAGHATTA",04 Jan 2027,CBR00068ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,Ashwini Clinic,"2 nd Cross , Vidya Nagar, Byadgi",30 Dec 2027,HVR00437ALCWD +Allopathy,Hospital (Level 1A),MANASA NURSING HOME,CHATRAKERI THIRTHAHALLI,24 Jan 2028,SMG00331ALH1A +Allopathy,Medical Diagnostic Laboratory,K.K DIAGNOSTIC LABORATORY,"GROUND FLOOR, ROBEN PLAZA, PADAVINANGADY, MANGALORE",01 Mar 2027,DKA00655ALMDL +Ayurveda,Clinic/Polyclinic with Dispensary,SHREE GANESH CLINIC,BHRAHMAVARA UDUPI,01 Mar 2027,UDP00582AYCWD +Ayurveda,Clinic/Polyclinic Only Consultation,ASHWINI CLINIC,"AT POST HUNASAGI, TQ SHORAPUR, DIST YADAGIRI",20 Jan 2027,YDR00421AYCOC +Ayurveda,Clinic/Polyclinic with Dispensary,ASHWINI CLINIC,"ASHWINI CLINIC,BSA COMPLEX,ATHUR",14 Jun 2027,DKA01093AYCWD +Allopathy,Dental Lab or Clinic,Dr. Sheethal Dental Clinic,"No. 86/4, Nagarabhavi Main Road, Opp. Bank of Baroda, Mudalapalya, B'lore- 72",29 Aug 2027,BLU03619ALDEN +Allopathy,Clinic/Polyclinic with Dispensary,NIPPU PAPPU KIDS CLINIC,"# 1222, 2ND MAIN, SBI BANK ROAD, HEBBAL, I STAGE MYSORE",10 Jul 2029,MYS01058ALCWD +Allopathy,Hospital (Level 1A),STEAM HOSPITAL,"NO 60, 1ST MAIN ROAD, KAMMAGONDANAHALLI, JALAHALLI WEST, BANGALORE-560015",05 Jan 2027,BLU02857ALH1A +Ayurveda,Clinic/Polyclinic Only Consultation,BALAJI CLINIC,#2 GROUND FLOOR K MALLASANDRA NADAVATHI POST HOSKOTE TALUK,08 Mar 2028,BLR00340AYCOC +Allopathy,Clinic/Polyclinic with Dispensary,CHAITANYA POLYCLINIC,"BANGALORE ROAD, BANDIMOTE, BALLARI",13 Jun 2027,BEL00333ALCWD +Allopathy,Dental Lab or Clinic,MARUTHI DENTAL CARE,"MARUTHI DENTAL CARE , BABU COMPLEX 1ST FLOOR, KLV CIRCLE, BESIDE PANDURANG TEMPLE , KADUR",11 Jan 2027,CKM00077ALDEN +Homeopathy,Clinic/Polyclinic with Dispensary,Navada Homoeo Clinic,"Navada Homeo clinic, narayana guru road, badagrama,uchila,udupi, 574117",10 Jan 2029,UDP01115HOCWD +Allopathy,Medical Diagnostic Laboratory,Nava Labs,"#296/3A 3B,Near Aluru Chandrashekarappa memorial Hospital, +Stadium Road, P J Extension.",02 Jun 2027,DVG00307ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,APPLEZONE HOSPITAL,LIDKAR COLONY BIDAR ROAD AURAD B,26 Sep 2027,BDR00182ALCOC +Allopathy,Clinic/Polyclinic with Observation,SKINMATICS,"1st Floor, Above Jockey Showroom, New Airport Road, Byreshwara Layout, Hennur Bande, HBR Layout, Bengaluru-560043",26 Jan 2027,BLU02924ALCWO +Ayurveda,Clinic/Polyclinic Only Consultation,GANESH AYUR AND HOMOEO CLINIC,"K.P. COMPLEX, MAIN ROAD, PUTTUR D.K. 574201",31 Mar 2027,DKA00772AYCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,SMT Puttanarasamma Charitable Health Centre,"No.01, Adakamaranahalli Village, Makali Post, Dasanapura Hobli, Bangalore - 562162",26 Jan 2027,BLU02925ALCDS +Allopathy,Dental Lab or Clinic,SMILE WORLD DENTAL CLINIC AND IMPLANT CENTER,"SHOP NO 24 , GROUND FLOOR , ADITHYANAGARA , YELAHANKA DOUBLE ROAD , OPP MARUTI SERVICE CENTRE , Bengaluru, 560097",20 Feb 2027,BLU03043ALDEN +Allopathy,Hospital (Level 1B),SHRI SIDDHA MULTI SPECIALITY HOSPITAL,"SY NO 286/D/2, PLOT NO 34,35,36,37,38,39 TALIKOTI DIST VIJAYAPUR",21 Jan 2027,BIJ00337ALH1B +Allopathy,Hospital (Level 2),GANDHI HOSPITAL,"D. No. 10-4-12, NEAR CITY BUS STAND, MOODANIDAMBUR VILLAGE UDUPI",08 Mar 2027,UDP00621ALHL2 +Allopathy,Specialty / Super-Specialty Specific Hospital,SANJEEVINI HOSPITAL A UNIT OF SMHIPL,"#761, 7TH MAIN, LAST BUSSTOP, MAHALAKSHMI LAYOUT, OFF ISKON TEMPLE 560086",05 Apr 2027,BLU03275ALSSH +Allopathy,Medical Diagnostic Laboratory,S R K Diagnostic Centre,"No.76, 1st Main, 2nd Cross, Badrappa Layout, Bangalore - 560094",08 Jan 2028,BLU04077ALMDL +Allopathy,Clinic/Polyclinic Only Consultation,BODY SCIENCE,NO 56 1ST FLOOR LONGFORD ROAD RICHMOND TOWN BANGALORE,08 Mar 2027,BLU03116ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,SREE VENKATESHWARA CLINICAL LABORATORY POLY CLINIC,"Pop to Police Quarters, Nagavara Main Road, KG Halli, Bangalore-560045",03 Jul 2029,BLU08066ALCDS +Allopathy,Hospital (Level 1A),SURAKSHAA HOSPITAL. A UNIT OF SURAKSHAA HEALTHCARE AND DIAGNOSTICS PVT LTD,"#745, 16th Cross, MCECHS Layout, 80ft Road, Dr.Shivaram Karanth Nagar Post, Bangalore - 560077",26 Jan 2027,BLU02933ALH1A +Allopathy,Hospital (Level 2),Vidya Hospital,"2nd main +Umashankara Nagar Ranebennur",16 May 2027,HVR00290ALHL2 +Allopathy,Medical Diagnostic Laboratory,LIFE CARE HEALTH CENTER,2-25 MANCHI KATTE MANCHI POST AND VILLAGE,22 May 2027,DKA00980ALMDL +Allopathy,Dental Lab or Clinic,Shreya Dental and Implant Clinic,"No.1/2, Adipampa Road, Paduvarhalli, V.V Mohalla",20 May 2027,MYS00461ALDEN +Ayurveda,Clinic/Polyclinic with Dispensary,ASHWINI CLINIC,"Ragati Peth, ILAKAL",07 Jun 2027,BGK00367AYCWD +Allopathy,Clinic/Polyclinic Only Consultation,Sai Manohar Polyclinic,"No.31, Behind Big Market, G Block, Sahakarnagar, Bengaluru-560092",26 Jan 2027,BLU02928ALCOC +Allopathy,Clinic/Polyclinic with Observation,SANJEEVINI POLY CLINIC,"NO 1544/139/1, GF NEAR MILK DAIRY, MAGADI MAIN ROAD, TAVEREKERE, BANGALORE-562130",09 Jan 2027,BLU02881ALCWO +Allopathy,Medical Diagnostic Laboratory,S B MEDICAL LABORATORY,"S V M HOSPITAL BUILDING +MAIN ROAD ,SULLIA.",25 May 2027,DKA01015ALMDL +Allopathy,Hospital (Level 1B),UNITY SOCIAL SERVICE SOCIETY PVT LTD,"NO.296/1, ADAKAMARANAHALLI, HIMALAYA DRUG HOUSE BACKSIDE, MAKALI POST, BANGALORE-562123.",16 Aug 2027,BLU03582ALH1B +Allopathy,Clinic/Polyclinic Only Consultation,SUDEEKSHA HEALTH CARE,"199, KHB 1st STAGE, KUVEMPUNAGAR",01 Jul 2027,MYS00589ALCOC +Integrated System,Clinic/Polyclinic Only Consultation,SRI MATHA CLINIC,DEVARAGUDDA ROAD RANEBENNUR 581115,30 Dec 2027,HVR00448ISCOC +Ayurveda,Clinic/Polyclinic with Dispensary,SRI DURGA CLINIC,BELLE COMPLEX MOODUBELLE,18 May 2027,UDP00702AYCWD +Allopathy,Medical Diagnostic Laboratory,UNITED MEDICAL LABORATORY,"NO.81, M.M ROAD, FRASER TOWN, BANGALORE-560005",19 Apr 2027,BLU03316ALMDL +Ayurveda,Hospital (Level 1B),SRIRANGA AYURVEDA CHIKITSA MANDIRA,"# 3394, 3RD STAGE, NEAR HOTEL NALPAK DATTAGALLI, MYSORE",26 May 2027,MYS00466AYH1B +Allopathy,Dental Lab or Clinic,GS Patil Dental clinic,"8, Leonard Ln, Richmond Town, +Bengaluru, 560025",19 May 2027,BLU03388ALDEN +Allopathy,Diagnostic Imaging Centre,BASAVESHWAR SCAN CENTRE AND CLINIC,"BASAVESHWAR SCAN CENTRE AND CLINIC +NH-4,NEAR PARANJYOTI GARAGE, +WARD NO-2, JOSHIGALLI, ILAKAL-587125",23 Jun 2027,BGK00442ALDIC +Allopathy,Hospital (Level 2),HATHIWALE HOSPITAL,DBOLE MALA NEAR MEENKASHI CHOWK,21 May 2027,BIJ00432ALHL2 +Allopathy,Clinic/Polyclinic Only Consultation,CHOUDHARI DENTAL CLINIC,CHOUDHARI BUILDING OPP MADHUVAN CROSS STATION ROAD VIJAYAPUR,09 Jun 2027,BIJ00457ALCOC +Allopathy,Specialty / Super-Specialty Specific Hospital,DECCAN MEDICAL CENTRE,"ODS SHED ROAD, RAILWAY OVER BRIDGE, BELAGAVI.",29 Jul 2027,BLG00746ALSSH +Ayurveda,Clinic/Polyclinic Only Consultation,BHAGAWAN AYURVEDIC CLINIC,"BHAGAWAN AYURVEDIC CLINIC , T M ROAD",16 Jun 2027,CKM00161AYCOC +Allopathy,Clinic/Polyclinic Only Consultation,SAUKHYA CLINIC,"Saukhya clinic, weigh bridge building, near Venkateshwara building, Sathanuru post",31 Jan 2028,MAN00271ALCOC +Allopathy,Clinic/Polyclinic with Diagnostic Support,AARYASPANDHANA DIAGNOSTICS,"NO 344,408, opp police station, kodihalli",13 Feb 2028,RMG00104ALCDS +Allopathy,Medical Diagnostic Laboratory,Shivam Diagnostic Laboratory,Near Shiva sai scanning center basaveshwar kalyan mantap road yadgiri,25 Mar 2027,YDR00467ALMDL +Allopathy,Medical Diagnostic Laboratory,Vijay Diagnostic Laboratory,Near Gandhi Chouk Shorapur tq shorapur dist yadagiri,27 Mar 2028,YDR00552ALMDL +Allopathy,Medical Diagnostic Laboratory,JANANI DIAGNOSTIC CENTRE,"RAMA MARAMMA CIRCLE, OLD HOSPITAL ROAD, SIDLAGHATTA",01 Jun 2027,CBR00120ALMDL +12345678910...,1,2,3,4,5 diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..888a0fb --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,70 @@ +site_name: CloudFerro Documentation +site_description: Documentation for CloudFerro services and products +site_author: CloudFerro +site_url: https://docs.cloudferro.com/ +docs_dir: docs +site_dir: site +use_directory_urls: false +strict: false + +# File handling +exclude_docs: | + *.tmp + .DS_Store + +# Directory handling +theme: + name: material + features: + - navigation.tabs + - navigation.tracking + - navigation.sections + - navigation.expand + - search.suggest + - search.highlight + +nav: + - Home: index.md + - Account Management: + - Overview: accountmanagement/accountmanagement.html.md + - Registration: accountmanagement/Registration-And-Account.html.md + - Cloud: + - Overview: cloud/cloud.html.md + - Data Volume: + - Overview: datavolume/datavolume.html.md + - Kubernetes: + - Overview: kubernetes/kubernetes.html.md + - Networking: + - Overview: networking/networking.html.md + - OpenStack CLI: + - Overview: openstackcli/openstackcli.html.md + - OpenStack Development: + - Overview: openstackdev/openstackdev.html.md + - S3: + - Overview: s3/s3.html.md + - Windows: + - Overview: windows/windows.html.md + - Release Notes: + - Latest: releasenotes/releasenotes.html.md + +markdown_extensions: + - admonition + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - tables + - toc: + permalink: true + - pymdownx.highlight + - pymdownx.inlinehilite + +plugins: + - search + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/cloudferro + name: CloudFerro on GitHub diff --git a/mkdocs_build_output.txt b/mkdocs_build_output.txt new file mode 100644 index 0000000..ba2934c --- /dev/null +++ b/mkdocs_build_output.txt @@ -0,0 +1,3021 @@ +INFO - Cleaning site directory +INFO - Building documentation to directory: /Users/dhanraj/Desktop/kpme_scraper/cloudferro-docs/site +WARNING - Doc file 'account_management.md' contains a link 'Registration-And-Account.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html#step-1-set-up-the-organization', but the target 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html#step-2-enable-payment-options', but the target 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html#step-3-activate-the-project', but the target 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html#step-4-start-using-the-chosen-cloud-in-horizon', but the target 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#which-one-to-use-freeotp-or-google-authenticator', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#what-we-are-going-to-cover', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#prerequisites', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#step-1-download-and-install-freeotp-from-the-app-store', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#step-2-scan-qr-and-create-brand', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#step-3-create-a-six-digit-code-to-enter-into-the-login-screen', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#how-to-start-using-the-mobile-authenticator-with-your-account', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html#logging-into-the-site-once-the-two-factor-authentication-is-installed', but the target 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#step-1-install-keepassxc', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#step-2-configure-keepassxc', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#step-3-add-the-entry-for-your-account', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#step-4-configure-totp', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#step-5-login-using-totp', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html#additional-information', but the target 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#one-factor-and-two-factor-authentication-for-activating-command-line-access-to-the-cloud', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#what-we-are-going-to-cover', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#prerequisites', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#how-to-download-the-rc-file', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#the-contents-of-the-downloaded-rc-file', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#how-to-activate-the-downloaded-rc-file', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#duration-of-life-for-environment-variables-set-by-sourcing-the-rc-file', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#testing-the-connection', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#resolving-errors', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html#what-to-do-next', but the target 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#what-are-we-going-to-cover', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#totp-important-information', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#entering-the-totp-management-console', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#removing-the-totp-secret-key', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html#adding-a-new-totp-secret-key', but the target 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Adding-Editing-Organizations.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#what-are-we-going-to-cover', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#step-1-check-for-the-correct-tax-id-or-vat-number', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#step-2-select-ppu-as-your-way-of-payment', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#step-3-define-how-many-credits-for-ppu-service', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#step-4-choose-payment-method', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#step-5-check-payment-reports', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Forgotten-Password.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Editing-Profile.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Contracts-Wallets.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Services.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Services.html#how-to-change-assigned-contract', but the target 'Services.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Inviting-New-User.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Removing-User-From-Organization.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html#differences-between-openstack-user-roles-and-tenant-manager-s-roles', but the target 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html#what-are-we-going-to-cover', but the target 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html#users-and-roles-in-the-tenant-manager', but the target 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html#adding-member-user-to-your-project-in-openstack-using-horizon-interface', but the target 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html#what-to-do-next', but the target 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Privacy-Policy.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#introducing-cookiebot-site', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#cookiebot-window', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#option-allow-all', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#details-view-of-available-cookies', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#how-to-give-consent-to-cookie-types', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#selecting-the-cookies-preferences', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#troubleshooting', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'account_management.md' contains a link 'Cookie-consent-on-CloudFerro-Cloud.html#setting-up-cookies-on-brand-name-subdomains', but the target 'Cookie-consent-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'adding_and_editing_organization.md' contains a link '../_images/register_organization_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'authenticating_with_openstacksdk_using_keycloak_credentials_on_cloudferro_cloud.md' contains a link '../_images/register_cloudferrocloud1.png', but the target is not found among documentation files. +WARNING - Doc file 'authenticating_with_openstacksdk_using_keycloak_credentials_on_cloudferro_cloud.md' contains a link '../_images/register_cloudferrocloud1.png', but the target is not found among documentation files. +WARNING - Doc file 'authenticating_with_openstacksdk_using_keycloak_credentials_on_cloudferro_cloud.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'authenticating_with_openstacksdk_using_keycloak_credentials_on_cloudferro_cloud.md' contains a link '../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/upgrade-kubernetes-17.png', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/upgrade-kubernetes-1.png', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/upgrade-kubernetes-11.png', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/upgrade-kubernetes-10.png', but the target is not found among documentation files. +WARNING - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/upgrade-kubernetes-15.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/size_screen_filled.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/clusters.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/enabled.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_successful.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nodegroup_list_1.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/autoscale_with_role.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nodegroup_with_added_role.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/autoscale_custom_worker.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/all_nodes.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/state_again.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/copy.png', but the target is not found among documentation files. +WARNING - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/labels.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/bucketnew_created.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/installation_of_velero.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/velero_version_working.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/installed_mybackup2.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/three_backups_mybackup.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/three_backups_mybackup.png', but the target is not found among documentation files. +WARNING - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '../_images/nginx-backup.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link 'Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-22_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '../_images/bootable-versus-nonbootable-volume-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link 'How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/run-mmc.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/snap-in.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/account-new.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/account-menu.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/account-properties.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/account-groups.png', but the target is not found among documentation files. +WARNING - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '../_images/account-final.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-5-10_16-28-4.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-26_15-4-3.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-5-10_16-30-8.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-26_16-58-33.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/drop-down-menu.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-26_17-57-57.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/select_ci_cd_option.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-29_12-56-40.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-29_14-13-1.png', but the target is not found among documentation files. +WARNING - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '../_images/image-2024-4-29_14-16-12.png', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html#using-console-for-administrative-tasks-within-linux-based-vms', but the target 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html#using-console-to-perform-administrative-tasks-within-fedora-vms', but the target 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-clone-existing-and-configured-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-fix-unresponsive-console-issue-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html#creating-a-pair-of-ec2-credentials', but the target 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html#listing-ec2-credentials', but the target 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html#deleting-ec2-credentials', but the target 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#step-1-cli-commands-for-application-credentials', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#step-2-the-simplest-way-to-create-a-new-application-credential', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#step-3-using-all-parameters-to-create-a-new-application-credential', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#step-4-enter-id-and-secret-into-clouds-yml', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#step-5-gain-access-to-the-cloud-by-specifying-os-cloud-or-os-cloud', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#environment-variable-based-storage', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#what-we-are-going-to-cover', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#prerequisites', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#step-1-install-x2go-client', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#step-2-install-the-desktop-environment-on-your-vm', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#step-3-connect-to-your-vm-using-x2go', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#troubleshooting-using-the-terminal-emulator-on-xfce', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html#troubleshooting-keyboard-layout', but the target 'How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html#step-1-create-new-instance-with-nvidia-image-support', but the target 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html#step-2-select-card-model-flavor', but the target 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html#step-3-finish-creating-the-instance', but the target 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html#step-4-issue-commands-from-the-console', but the target 'How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#before-docker-installation', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#install-docker-engine', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#basic-docker-commands', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#troubleshooting', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Docker-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-use-Docker-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html#viewing-the-security-groups', but the target 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html#creating-a-new-security-group', but the target 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html#adding-security-rules-to-a-security-group', but the target 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html#adding-a-security-group-to-your-vm', but the target 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html#a-volume-snapshot', but the target 'How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html#b-image-snapshot', but the target 'How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html#power-state-while-vm-is-running', but the target 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html#power-state-while-vm-is-turned-off', but the target 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html#status-and-its-conditions', but the target 'Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#always-use-the-latest-value-of-image-id', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#step-1-check-for-the-presence-of-the-image-in-your-openstack-cloud', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#step-2-know-the-rules-for-the-image-before-uploading-it', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#step-3-upload-the-image', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#troubleshooting-internet-connection-lost', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'What-is-an-OpenStack-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#options-for-creation-of-a-virtual-machine-vm', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-1-start-the-launch-instance-window-and-name-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-2-define-the-source-of-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-3-define-the-flavor-of-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-4-define-networks-for-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-5-define-security-groups-for-vm', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-6-create-a-key-pair-for-ssh-access', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-7-create-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-8-attach-a-floating-ip-to-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-9-convert-your-ssh-key', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-10-configure-putty', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-11-save-the-session-settings', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#step-12-connect-to-your-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#using-your-saved-putty-session-to-simplify-login', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#options-for-creation-of-a-virtual-machine-vm', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-1-start-the-launch-instance-window-and-name-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-2-define-the-source-of-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-3-define-the-flavor-of-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-4-define-networks-for-the-virtual-machine', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-5-define-security-groups-for-vm', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-6-create-a-key-pair-for-ssh-access', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-7-create-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-8-attach-a-floating-ip-to-the-instance', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#step-9-connecting-to-your-virtual-machine-using-ssh', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#what-we-are-going-to-cover', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#prerequisites', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-1-delegate-domain-to-your-registrar-s-system', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-2-zone-configuration', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-3-checking-the-presence-of-the-domain-on-the-internet', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-4-adding-new-record-for-the-domain', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-5-adding-records-for-subdomains', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#step-6-managing-records', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#limitations', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html#what-to-do-next', but the target 'DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#what-we-are-going-to-cover', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#prerequisites', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#step-1-check-for-the-presence-of-image-in-your-openstack-cloud', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#step-2-know-the-rules-for-the-image-before-uploading-it', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#step-3-upload-the-image', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#troubleshooting-internet-connection-lost', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html#what-to-do-next', but the target 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#what-are-we-going-to-cover', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-1-access-the-launch-instance-menu', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-2-choose-the-instance-name', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-3-choose-source', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-4-choose-flavor', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-5-attach-networks-to-your-virtual-machine', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-6-choose-security-groups', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-7-launch-your-virtual-machine', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-8-set-the-administrator-password', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#step-9-update-windows', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#step-1-initializing-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#step-2-accepting-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#cancelling-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#prerequisites', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#how-to-create-spot-instances', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#additional-configuration-via-tags', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#currently-supported-tags', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#the-expected-behaviour-of-spot-instances', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Spot-instances-on-CloudFerro-Cloud.html#how-to-convert-spot-instance-to-on-demand-instance', but the target 'Spot-instances-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#the-plan', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#creating-a-snapshot-of-instance-which-uses-ephemeral-storage', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#snapshot-of-instance-which-uses-persistent-storage', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#creating-vm-from-instance-snapshot', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#what-can-go-wrong-when-recreating-instance-from-instance-snapshot', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#verifying-volumes-when-using-persistent-storage', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#prerequisites', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#always-use-the-latest-value-of-image-id', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#the-openstack-command-to-create-a-vm', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#step-1-selecting-parameters-of-the-new-virtual-machine', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#step-2-create-a-virtual-machine', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#step-3-add-a-floating-ip-to-the-existing-vm', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#step-4-use-ssh-to-access-the-vm', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html#what-to-do-next', but the target 'How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#prerequisites', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#frequently-used-user-roles', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#how-to-view-roles-in-horizon', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#examples-of-using-user-roles', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html#dictionary-of-other-roles', but the target 'OpenStack-user-roles-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#introduction', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#prerequisites', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#creating-a-new-vm', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#steps-to-resize-the-vm', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#advanced-options', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#resize-the-vm', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#troubleshooting', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'cloud.md' contains a link 'Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html#current-limits', but the target 'Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'configuration_files_for_s3cmd_command_on_cloudferro_cloud.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuration_files_for_s3cmd_command_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'configuration_files_for_s3cmd_command_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-1.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-2.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '../_images/whitelisting-loadbalancer-4.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '../_images/whitelisting-loadbalancer-5.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-3.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link '../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link '../_images/whitelisting-loadbalancer-1.png', but the target is not found among documentation files. +WARNING - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link 'How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn01.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn11b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn02b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn03b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn04b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn05b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn10b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn06b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn07b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn08b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn09b.png', but the target is not found among documentation files. +WARNING - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '../_images/conn11.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-1.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-2.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-for-site-1.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-13.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-15.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-4.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-12.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-5.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-6.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-7.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link 'Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-8.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-11.png', but the target is not found among documentation files. +WARNING - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '../_images/cookie-consent-cloudferro-cloud-9.png', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/nfs_server_2049.png', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-1_17-6-3.png', but the target is not found among documentation files. +WARNING - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-1_17-8-5.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/present_clusters.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/listing_nodegroups.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/created_new_nodegroup.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/stacks_creations.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_inside.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/role_test.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/table_testing.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/filtered_cirros.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nodegroup_resized.png', but the target is not found among documentation files. +WARNING - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nodegroups_network_graph.png', but the target is not found among documentation files. +WARNING - Doc file 'dashboard_overview_–_project_quotas_and_flavors_limits_on_cloudferro_cloud.md' contains a link '../_images/dashboardover1-v2.png', but the target is not found among documentation files. +WARNING - Doc file 'dashboard_overview_–_project_quotas_and_flavors_limits_on_cloudferro_cloud.md' contains a link '../_images/dashboardover2-v2.png', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-1-create-a-volume', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-2-attach-the-volume-to-vm', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-3-partition-the-volume', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-5-create-the-file-system', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-6-create-the-mount-point', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-1-create-a-volume', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-2-attach-the-volume-to-vm', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-3-create-the-partition-table', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-5-create-the-file-system', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#step-6-create-the-mount-point', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-export-a-volume-over-NFS-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-export-a-volume-over-NFS-outside-of-a-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-extend-the-volume-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html#check-your-credentials-and-save-them-in-a-file', but the target 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html#enable-3fs', but the target 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#ensure-that-the-transfer-is-possible', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#shutting-down-the-source-virtual-machine', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#shutting-down-your-virtual-machine-using-horizon-dashboard', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#disconnecting-volume', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#attaching-volume-to-destination-virtual-machine', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-many-objects-can-I-put-into-Object-Storage-container-bucket-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#disconnecting-the-volume-from-a-virtual-machine', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#creating-a-backup-of-your-volume', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#restoring-the-backup', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html#reattaching-the-volume-to-your-virtual-machine', but the target 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#prerequisites', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#step-1-create-a-new-volume', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#step-2-attach-the-volume-to-vm', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#step-3-format-the-drive', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html#creating-volume-snapshot', but the target 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html#deleting-volume-snapshot', but the target 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html#restoring-volume-snapshot-using-horizon-dashboard', but the target 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html#restoring-volume-snapshot-using-openstack-cli-client', but the target 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#bootable-vs-non-bootable-volumes', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#prerequisites', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#which-volumes-appear-when-creating-a-virtual-machine-using-horizon-dashboard', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#attempting-to-create-a-virtual-machine-from-non-bootable-volume-using-openstack-cli', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#checking-whether-a-volume-is-bootable', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#checking-whether-a-volume-snapshot-was-created-from-a-bootable-volume', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#modifying-bootable-status-of-a-volume', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'data_volume.md' contains a link 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html#what-happens-if-you-launch-a-virtual-machine-from-a-volume-which-does-not-have-a-functional-operating-system', but the target 'Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '../_images/create_cluster_details.png', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '../_images/create_cluster_size.png', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '../_images/create_cluster_advanced.png', but the target is not found among documentation files. +WARNING - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '../_images/create_cluster_working.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-4-4_13-37-48.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-4-4_13-28-40.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/keycloack_full_screen.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_15-24-46.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_15-26-51.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_15-29-22.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_15-40-56.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/create_client_with_authentication.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_16-8-44.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-14_16-41-7.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-15_8-43-7.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-26_11-27-0.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/flask_run.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-26_11-54-29.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-26_12-0-35.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-26_12-36-24.png', but the target is not found among documentation files. +WARNING - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '../_images/image2023-6-26_12-42-24.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../_images/search_repo.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../_images/apache_bitnami.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../_images/parameters.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../_images/apache_ip.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '../_images/trag_8080.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link '../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link '../_images/floating_ips.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link '../_images/image2022-12-9_10-55-8.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/request_for_nodegroup.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/result_of_creating_nodegroup.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/older_uuid.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/gpu_templates.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/daemonset_01.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/kubectl_get_node.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/go_template_image.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/apply_yaml.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/template_show_non_gpu.png', but the target is not found among documentation files. +WARNING - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/nodegroups_in_cluster_id.png', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../_images/dns1.png', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../_images/create_main_site_dns.png', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../_images/create_www_subdomain.png', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../_images/show_example_domain_record_sets.png', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '../kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'editing_profile.md' contains a link '../_images/editing_profile_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_13-15-17.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_14-44-49.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_15-39-52.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_15-48-38.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_16-8-43.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_15-58-45.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_16-13-21.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_16-31-37.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '../_images/image-2024-2-13_16-29-35.png', but the target is not found among documentation files. +WARNING - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'ephemeral_vs_persistent_storage_option_create_new_volume_on_cloudferro_cloud.md' contains a link 'Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'ephemeral_vs_persistent_storage_option_create_new_volume_on_cloudferro_cloud.md' contains a link '../cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'ephemeral_vs_persistent_storage_option_create_new_volume_on_cloudferro_cloud.md' contains a link '../cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'forgotten_password.md' contains a link '../_images/forgot_your_password_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'forgotten_password.md' contains a link '../_images/enter_new_password_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_an_ssh_keypair_in_linux_on_cloudferro_cloud.md' contains a link '../_images/ssh1.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_an_ssh_keypair_in_linux_on_cloudferro_cloud.md' contains a link '../_images/ssh2.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_an_ssh_keypair_in_linux_on_cloudferro_cloud.md' contains a link '../_images/ssh3.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_adding_repository.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_flavor_list_short.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_init.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_yes.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_apply.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../_images/terraform_horizon.png', but the target is not found among documentation files. +WARNING - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-14_14-54-10.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-14_15-4-21.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-14_15-34-0.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-22_10-38-53.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-17_11-20-27.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-22_10-23-58.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-22_10-27-25.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-22_11-17-12.png', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html', but the target is not found among documentation files. +WARNING - Doc file 'helpdesk_and_support.md' contains a link '../_images/tickets_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'helpdesk_and_support.md' contains a link '../_images/add_ticket_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_can_i_open_new_ports_for_http_for_my_service_or_instance_on_cloudferro_cloud.md' contains a link '../_images/edit.png', but the target is not found among documentation files. +WARNING - Doc file 'how_is_my_vm_visible_in_the_internet_with_no_floating_ip_attached_on_cloudferro_cloud.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/01.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/02.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/03.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/04.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/05.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/06.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/07.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/08.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/09.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/14.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '../_images/15.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/download_config_cli.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/download_config_horizon.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_config_editor.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/get_nodes_large.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/kubectl_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../_images/code_structure.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '../accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/openstack_container_create_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/combination_swift_commands.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/object_create_container_name.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/object_list_backup09.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../s3/How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_private_object_storage_using_s3cmd_or_boto3_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_private_object_storage_using_s3cmd_or_boto3_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_private_object_storage_using_s3cmd_or_boto3_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_private_object_storage_using_s3cmd_or_boto3_on_cloudferro_cloud.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/login_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/accessvm2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/accessvm3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/accessvm4v2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/sudo_su_eouser.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/some_nodes.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/fedora_image.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '../_images/accessvm5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/rc_file_content.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/activate-api-2fa-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/activate-api-2fa-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/freeotp_icon_to_select.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/freeotp_icon_to_select.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/freeotp_tapped_number.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/freeotp_tapped_number.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/activate-api-2fa-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/flavor_list_2fa_short.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../_images/jq_error.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link 'Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '../cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '../_images/fip9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '../_images/pastebin1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '../_images/pastebin2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '../_images/pastebin3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '../_images/pastebin4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '../_images/pastebin5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-less-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link 'How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '../_images/volume-more-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '../_images/create-volume-windows-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link 'How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/backupinst1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/backupinst2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/backupinst3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/backupinst4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/backupinst5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link 'Contracts-Wallets.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link 'Adding-Editing-Organizations.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '../_images/cloudferro_cloud_10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link '../_images/saml_cloudferro_cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link '../_images/clone2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link '../_images/clone3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link 'How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link '../datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '../_images/c1.png', but the target is not found among documentation files. +INFO - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains an absolute link '/cdn-cgi/l/email-protection#6d0802181e081f4b4e5e5a564b4e585f564b4e59555619081e19', it was left as is. +WARNING - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '../_images/c4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_your_virtual_machine_via_ssh_in_linux_on_cloudferro_cloud.md' contains a link '../_images/ssh_linux1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_your_virtual_machine_via_ssh_in_linux_on_cloudferro_cloud.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_connect_to_your_virtual_machine_via_ssh_in_linux_on_cloudferro_cloud.md' contains a link '../_images/ssh_linux2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/clusters_command.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/create_new_cluster.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_name_filled_in.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_template_detail2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/white_keypair_select.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/create_new_cluster_filled_in2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_size_new.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/number_of_master_nodes_filled_in.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/flavor2_master2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/worker_nodes_number.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/auto_scaling_filled_in.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/size_screen_filled.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/network_option.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/use_an_existing_network.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/management.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/advanced_option.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/unable_to_create_a_cluster.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cluster_forming.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/creation_in_progress2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/network_topology_with_labels.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/new_instances2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link 'How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/boot_source.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/yellow_triangles.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../_images/ip_address_from_article.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link 'How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/boot_source.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/yellow_triangles.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/create-linux-linux-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/ip_address_from_article.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-02.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-03.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-04.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-05.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-06.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-07.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-08.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-09.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/key-location-putty.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-14.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-15.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-16.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../_images/putty-13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/net13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/compute_instances.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/launch_instance.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/choose_os.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/nvidia_chosen_cloudferro_cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew18.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew16.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew19.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/networks5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/createnew14.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/heat-test2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/heat_test2_stacks.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/heat_test2_instances.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/stacks_menu.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/click_button_launch_stack.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/orch4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/select_template_yaml.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/launch_stack.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/create_new_template.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/heat_instance.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/create_heat_4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/four_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '../_images/template_generator.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/openstack_server_create_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/create_vm_cli_1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_124004.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_125234.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_132619.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_125651.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_130817.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_132113.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_133524.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_134749.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_135229.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_143434.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../_images/Screenshot_20241006_145844.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '../openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/present_networks.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/default_security_groups.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/identity_projects.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/create_project.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/screen03.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/screen03a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/select_role.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/new_project.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/projects_present.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/testproject.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/no_networks_present.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/api_access.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/user_credentials.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/add_ticket.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../_images/screen07.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../accountmanagement/Inviting-New-User.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '../accountmanagement/Removing-User-From-Organization.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/enable_load_balancer_checked.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/enable_load_balancer_unchecked.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/noloadbalancer_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nodes_address.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/created_instances.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/associate_floating_ip.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/floating_ip_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/confi_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/master_node_addresses.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/kubectl_without_access.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/swapped_address.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/kubectl_working.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '../_images/volume-backup-18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/uses_ephemeral.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/shut_off_instance.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_ephemeral_shut_off.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_ephemeral_create_snapshot.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_ephemeral_snapshot.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_blue_green.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_volumes_volumes.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_shut_down_indees.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_create_shanpshot_button.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_new_name.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_active_0bytes.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_show_data.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/instance_persistent_volume_shapshot.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-horizon-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '../datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-22_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-20_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-instance-snapshot-cli-23_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../_images/keypair1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../_images/keypair2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../_images/keypair3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../_images/keypair4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../_images/keypair5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '../windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../_images/image-2024-6-17_15-52-40.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../_images/image-2024-6-18_17-32-8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '../_images/image-2024-6-18_18-1-53.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../_images/newvm13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-cli-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-cli-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-Horizon-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-cli-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-create-volume-snapshot-cli-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link 'How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../cloud/How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '../cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../_images/ssh_windows_6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link 'How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-20_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../_images/create_ssh_key_windows_11-22_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link 'How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-23_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-24_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-25_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-26_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-27_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../_images/create-windows-vm-horizon-web-console-28_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link 'How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_delete_large_s3_bucket_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_delete_large_s3_bucket_on_cloudferro_cloud.md' contains a link 'How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_export_a_volume_over_nfs_on_cloudferro_cloud.md' contains a link '../networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link 'How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link 'How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '../_images/vol6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_fix_unresponsive_console_issue_on_cloudferro_cloud.md' contains a link '../_images/fixconsole.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../_images/generate_credentials.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../_images/several_ec2_pairs.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../_images/removed_ec2_empty.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../s3/How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '../s3/How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/credential_create_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/create_new_with_name.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/complete_example.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/create_credential.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/nano_values.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/export_os_cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../_images/cli_os_cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '../kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link 'OpenStack-user-roles-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link 'How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link 'Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/ssh-import-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/ssh-import-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/ssh-import-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/ssh-import-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/new_docker-1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/new_docker-1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/use-docker-9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/use-docker-4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/use-docker-5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/use-docker-6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '../_images/use-docker-7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../_images/boto1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../_images/boto2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../_images/boto3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '../_images/boto4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/openstack_cli.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/openstack_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/openstack_vim.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/networks_list.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/network_list.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/openstack_coe.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/openstack_coe_cluster_list.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '../_images/cluster_list_horizon.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../_images/activate_environment.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../_images/install_new_pip.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../_images/openstack_cli_install_linux_help.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '../_images/openstackcli_flavor_list.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/git-bash12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../_images/enter_the_six_digit_code2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../_images/wsl20_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '../kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link 'kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/customize_the_cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-29_9-56-44.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-29_9-54-45.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-23_16-5-28.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-29_10-2-57.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/credentials_first_time.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-26_12-36-54.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_13-56-3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_14-9-18.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_15-20-4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_15-27-55.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_15-29-17.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '../_images/image-2024-7-24_15-30-26.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link '../_images/install-s3cmd-linux-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link '../_images/install-s3cmd-linux-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '../_images/manage-totp-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '../_images/manage-totp-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '../_images/manage-totp-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '../_images/manage-totp-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '../_images/manage-totp-05_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '../_images/mount-object-storage-s3fs-linux-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '../_images/mount-object-storage-s3fs-linux-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '../_images/mount-object-storage-s3fs-linux-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '../_images/mount-object-storage-s3fs-linux-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/object-storage-windows-example1_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-rclone-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-rclone-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-nssm-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-object-storage-windows-horizon-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '../_images/mount-eodata-windows-open-remove-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link 'How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_in_linux_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_mount_object_storage_in_linux_on_cloudferro_cloud.md' contains a link '../s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-33_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-34_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-30_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-27_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-28_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-horizon-29_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-31_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-32_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/how-to-move-data-volume-cli-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-Horizon-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-Horizon-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-Horizon-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-Horizon-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-cli-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../_images/how-to-restore-volume-from-snapshot-cli-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link 'How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen9.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/scrn10.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen11.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen12.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen13.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen14.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen15.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen16.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen17b.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen18.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen19.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen20.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen21.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen22.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen23.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen23a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen24a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen25a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen26a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen27a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen28a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen29b.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen30b.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen31a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen32a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen33a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen34a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen35a.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/screen36.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/scrn30.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '../_images/scrn28.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/projects.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/users.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_con.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_login.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_main.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_rc.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_upload_0.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_upload_1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../_images/owner_upload_1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '../s3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap00.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap01.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap7.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link 'How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap8.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap1.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap2.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap3.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap4.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap5.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link 'How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '../_images/snap6.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link 'How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_details.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_source.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_flavor.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_networks.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_security_groups.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_key_pair.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_launch_instance.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/launch_instance_created_instances.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/unavailable_network.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_horizon-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/step-create-an-image.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/start_vm_instance_snapshot_cli-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-2-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-4-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link 'Adding-Editing-Organizations.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-3-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link 'How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-5-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-6-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-7-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-10-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '../_images/dashboard-services-9-cloudferro-cloud.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-32_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-37_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-33_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-20_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-21_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-35_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-36_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-38_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-horizon-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-32_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-25_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-26_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-27_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-33_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../_images/transfer-volume-between-projects-cli-34_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '../cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link 'What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/image_options_explanation.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/format_image_upload.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/debian_test_created.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '../_images/upload-image-horizon-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link 'How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/upload-image-cli-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link 'How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/flavors_list.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/horizon_flavors.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/kubernetes_url.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/api_address.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_openstack_line_entry.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_long_line.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_blanks.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_no_blanks.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_blanks_ok.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/ku_labels_broken.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/cli_newcluster.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/overview.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/after_delete_cluster.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-12_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '../_images/linux-gui-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-new-container_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-new-folder_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-upload_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-success_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-16_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-17_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-delete-folder_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-18_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-19_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-delete-delete-selected_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-13_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-14_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '../_images/use-object-storage-15_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link 'How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-1_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-2_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-3_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-4_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-5_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-6_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '../_images/use-security-groups-7_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link '../_images/welcome_nginx.png', but the target is not found among documentation files. +WARNING - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link '../_images/prometheus-dashboard_9090.png', but the target is not found among documentation files. +WARNING - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link '../_images/locust_test.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-4v2.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-5v2.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-7v2.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-8v2.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '../_images/whitelisting_again-9v2.png', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link '../_images/image2023-2-15_16-41-49.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link '../_images/first_argo_example.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link '../_images/image2023-2-15_17-50-44.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link '../_images/image2023-2-15_18-13-51.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '../_images/image2023-8-8_14-2-4.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '../_images/image2023-8-8_14-4-40.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '../_images/kubectl_show_5_workers.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '../_images/dask_dashboard_5_workers.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '../_images/wsl_v1_error_message.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../s3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../s3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../_images/install_noobaa_locally.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../_images/create_object_container.png', but the target is not found among documentation files. +WARNING - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '../_images/image2023-7-20_11-58-22.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/no-ingress-controller.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/use_125_version.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-4-30_14-0-23.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/a_record_in_dns.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/successful_installation_of_gitlab.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/gitlab_get_pods.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-6_13-48-13.png', but the target is not found among documentation files. +WARNING - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-6_14-25-36.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link '../_images/unsealing_the_pod.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link '../_images/vault_created.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link '../_images/start_using_vault.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link '../_images/vim_editor_change.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link '../_images/installation_done.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link '../_images/image2023-1-13_13-6-5.png', but the target is not found among documentation files. +WARNING - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link '../_images/image2023-2-6_15-25-4.png', but the target is not found among documentation files. +WARNING - Doc file 'inviting_new_user_to_your_organization.md' contains a link '../_images/inv_01_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'inviting_new_user_to_your_organization.md' contains a link '../_images/inv_02_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'inviting_new_user_to_your_organization.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_13-17-10.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_13-22-56.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_13-40-1.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_14-24-1.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_14-47-56.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_14-54-8.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_15-1-59.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_15-15-23.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_15-16-10.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/importdashboard.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '../_images/image2023-11-7_15-38-40.png', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-create-new-cluster-screen', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-define-master-and-worker-nodes', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-defining-network-and-loadbalancer', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-advanced-options', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-5-forming-of-the-cluster', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#step-6-review-cluster-state', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#what-we-are-going-to-cover', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#prerequisites', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#templates-available-on-your-cloud', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#how-to-choose-a-proper-template', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#overview-and-benefits-of-localstorage-templates', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html#example-parameters-to-create-a-new-cluster-with-localstorage-and-nvme', but the target 'Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#how-to-issue-commands-to-the-openstack-and-magnum-servers', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#what-we-are-going-to-cover', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#notes-on-python-versions-and-environments-for-installation', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#prerequisites', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#step-1-install-the-cli-for-kubernetes-on-openstack-magnum', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#step-2-how-to-use-the-openstack-client', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#the-help-command', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#step-4-how-to-use-the-magnum-client', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html#what-to-do-next', but the target 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#the-advantages-of-using-the-cli', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#how-to-enter-openstack-commands', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#openstack-command-for-creation-of-cluster', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#how-to-check-upon-the-status-of-the-cluster', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#failure-to-create-a-cluster', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#cli-commands-to-delete-a-cluster', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#the-plan', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-create-directory-to-download-the-certificates', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-2a-download-certificates-from-the-server-using-the-cli-commands', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-2b-download-certificates-from-the-server-using-horizon-commands', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-verify-that-kubectl-has-access-to-the-cloud', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-deploying-the-dashboard', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-creating-a-sample-user', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-create-secret-for-admin-user', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-get-the-bearer-token-for-authentication-to-dashboard', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-5-create-a-separate-terminal-window-for-proxy-access', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-6-see-the-dashboard-in-browser', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-do', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#how-to-enable-or-disable-load-balancer-for-master-nodes', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#one-master-node-no-load-balancer-and-the-problem-it-all-creates', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-create-a-cluster-with-one-master-node-and-no-load-balancer', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-create-floating-ip-for-master-node', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-create-config-file-for-kubernetes-cluster', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-swap-existing-floating-ip-address-for-the-network-address', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-add-parameter-insecure-skip-tls-verify-true-to-make-kubectl-work', but the target 'How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#the-benefits-of-using-nodegroups', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#nodegroup-subcommands', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-access-the-current-state-of-clusters-and-their-nodegroups', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-how-to-create-a-new-nodegroup', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-using-role-to-filter-nodegroups-in-the-cluster', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-show-details-of-the-nodegroup-created', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-5-delete-the-existing-nodegroup', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-6-update-the-existing-nodegroup', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-7-resize-the-nodegroup', but the target 'Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#horizontal-pod-autoscaler', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#vertical-pod-autoscaler', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#cluster-autoscaler', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#define-autoscaling-when-creating-a-cluster', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#autoscaling-node-groups-at-run-time', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#how-autoscaling-detects-upper-limit', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#autoscaling-labels-for-clusters', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#create-new-cluster-using-cli-with-autoscaling-on', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#nodegroups-with-worker-role-will-be-automatically-autoscalled', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#how-to-obtain-all-labels-from-horizon-interface', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#how-to-obtain-all-labels-from-the-cli', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#use-labels-string-when-creating-cluster-in-horizon', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-create-cluster-using-docker-volume-size', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-create-pod-manifest', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-create-a-pod-on-node-0-of-dockerspace', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-executing-bash-commands-in-the-container', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-5-saving-a-file-into-persistent-storage', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-6-check-the-file-saved-in-previous-step', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#what-is-velero', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#what-we-are-going-to-cover', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#prerequisites', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#before-installing-velero', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#working-with-velero', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#example-1-basics-of-restoring-an-application', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#example-2-snapshot-of-restoring-an-application', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#delete-a-velero-backup', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#removing-velero-from-the-cluster', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Backup-of-Kubernetes-Cluster-using-Velero.html#what-to-do-next', but the target 'Backup-of-Kubernetes-Cluster-using-Velero.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-we-are-going-to-cover', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-1-create-a-magnum-kubernetes-cluster-with-nginx-ingress-enabled', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-2-creating-services-for-nginx-and-apache-webserver', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-3-create-ingress-resource', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#step-4-verify-that-it-works', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html#what-to-do-next', but the target 'Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#what-we-are-going-to-cover', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#prerequisites', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#background-how-helm-works', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#install-helm', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#add-a-helm-repository', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#helm-chart-repositories', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#check-whether-kubectl-has-access-to-the-cluster', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#deploy-a-helm-chart-on-a-cluster', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#customizing-the-chart-deployment', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html#what-to-do-next', but the target 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#what-we-are-going-to-cover', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#prerequisites', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-1-install-cert-manager-s-custom-resource-definitions-crds', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-2-install-certmanager-helm-chart', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-3-create-a-deployment-and-a-service', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-4-create-and-deploy-an-issuer', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-5-associate-the-domain-with-nginx-ingress', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#step-6-create-and-deploy-an-ingress-resource', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html#what-to-do-next', but the target 'Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#what-we-are-going-to-cover', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#prerequisites', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-1-authenticate-to-the-cluster', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-2-apply-preliminary-configuration', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-3-run-jupyterhub-helm-chart-installation', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-4-retrieve-details-of-your-service', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-5-run-on-https', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#what-to-do-next', but the target 'Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#what-we-are-going-to-cover', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#prerequisites', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#authenticate-to-the-cluster', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#apply-preliminary-configuration', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#install-argo-workflows', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#run-argo-workflows-from-the-cloud', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#run-sample-workflow-with-two-tasks', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html#what-to-do-next', but the target 'Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#what-we-are-going-to-cover', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#prerequisites', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-1-install-cfssl', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-2-generate-tls-certificates', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-3-install-consul-helm-chart', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-4-install-vault-helm-chart', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#sealing-and-unsealing-the-vault', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-5-unseal-vault', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#step-6-run-vault-ui', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#return-livenessprobe-to-production-value', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#troubleshooting', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html#what-to-do-next', but the target 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#prerequisites', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#install-nginx-ingress-on-magnum-cluster', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#install-prometheus', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#install-keda', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#deploy-a-sample-app', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#deploy-our-app-ingress', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#access-prometheus-dashboard', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#deploy-keda-scaledobject', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#test-with-locust', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html#cooling-down', but the target 'HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#prerequisites', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#set-up-nfs-server-on-a-vm', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#set-up-a-share-folder-on-the-nfs-server', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#make-the-share-available', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html#deploy-a-test-pod-on-the-cluster', but the target 'Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#what-we-are-going-to-do', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#prerequisites', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-1-deploy-keycloak-on-kubernetes', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-2-create-keycloak-realm', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-3-create-and-configure-keycloak-client', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-4-create-a-user-in-keycloak', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-5-retrieve-client-secret-from-keycloak', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-6-create-a-flask-web-app-utilizing-keycloak-authentication', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html#step-7-test-the-application', but the target 'Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#what-we-are-going-to-cover', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#prerequisites', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-1-install-dask-on-kubernetes', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-2-access-jupyter-and-dask-scheduler-dashboard', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-3-run-a-sample-computing-task', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#step-4-configure-dask-cluster-on-kubernetes-from-python', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html#resolving-errors', but the target 'Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#prerequisites', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#install-noobaa-in-local-environment', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#apply-preliminary-configuration', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#install-noobaa-on-the-kubernetes-cluster', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#create-a-noobaa-backing-store', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html#connect-noobaa-in-a-multi-cloud-setup', but the target 'Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#benefits-of-using-your-own-private-container-registry', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#what-we-are-going-to-cover', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#prerequisites', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#deploy-harbor-private-registry-with-bitnami-harbor-helm-chart', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#access-harbor-from-browser', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#associate-the-a-record-of-your-domain-to-harbor-s-ip-address', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#create-a-project-in-harbor', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#create-a-dockerfile-for-our-custom-image', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#ensure-trust-from-our-local-docker-instance', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#build-our-image-locally', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#upload-a-docker-image-to-your-harbor-instance', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html#download-a-docker-image-from-your-harbor-instance', but the target 'Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#what-are-we-going-to-cover', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#prerequisites', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#vgpu-flavors-per-cloud', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#hardware-comparison-between-rtx-a6000-and-nvidia-l40s', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#scenario-1-add-vgpu-nodes-as-a-nodegroup-on-a-non-gpu-kubernetes-clusters-created-after-june-21st-2023', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#scenario-2-add-vgpu-nodes-as-nodegroups-on-non-gpu-kubernetes-clusters-created-before-june-21st-2023', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#scenario-3-create-a-new-gpu-first-kubernetes-cluster-with-vgpu-enabled-default-nodegroup', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html#add-non-gpu-nodegroup-to-a-gpu-first-cluster', but the target 'Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#what-are-we-going-to-cover', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#prerequisites', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#install-prometheus-with-helm', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#install-grafana', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#add-prometheus-as-datasource-to-grafana', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#add-cluster-observability-dashboard', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#what-we-are-going-to-cover', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#prerequisites', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#background', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#create-kubernetes-cluster-with-kubeapps-quick-launcher-enabled', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#access-kubeapps-service-locally-from-your-browser', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#launch-sample-application-from-kubeapps', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html#current-limitations', but the target 'Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#what-we-are-going-to-cover', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#prerequisites', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#step-1-create-a-floating-ip-and-associate-the-a-record-in-dns', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#step-2-apply-preliminary-configuration', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#step-3-install-gitlab-helm-chart', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#step-4-verify-the-installation', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#errors-during-the-installation', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html#what-to-do-next', but the target 'Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#what-we-are-going-to-cover', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#prerequisites', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#step-1-install-the-sealed-secrets-controller', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#step-2-install-the-kubeseal-command-line-utility', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#step-3-create-a-sealed-secret', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#step-4-unseal-the-secret', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#step-5-verify', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html#what-to-do-next', but the target 'Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#what-we-are-going-to-cover', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#prerequisites', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#step-1-add-your-public-key-to-gitlab-and-access-gitlab-from-your-command-line', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#step-2-create-project-in-gitlab-and-add-sample-application-code', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#step-3-define-environment-variables-with-your-dockerhub-coordinates-in-gitlab', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#step-4-create-a-pipeline-to-build-your-app-s-docker-image-using-kaniko', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#step-5-trigger-pipeline-build', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html#what-to-do-next', but the target 'CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html#define-provider-for-terraform', but the target 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html#define-cluster-resource-in-terraform', but the target 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html#apply-the-configurations-and-create-the-cluster', but the target 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#what-we-are-going-to-cover', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#prerequisites', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-1-install-argo-cd', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-2-access-argo-cd-from-your-browser', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-3-create-a-git-repository', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-4-download-flask-application', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-5-push-your-app-deployment-configurations', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-6-create-argo-cd-application-resource', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-7-deploy-argo-cd-application', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#step-8-view-the-deployed-resources', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html#what-to-do-next', but the target 'GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html#state-of-security-before-and-after', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html#verification-tools', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#prerequisites', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#prepare-your-environment', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#configure-terraform-for-whitelisting', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#import-existing-load-balancer-listener', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#run-terraform', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#tests', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#what-are-we-going-to-do', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#introduction', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#prerequisites', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#horizon-whitelisting-load-balancers', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#cli-whitelisting-load-balancers', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#terraform-whitelisting-load-balancers', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#state-of-security-before-and-after-whitelisting-the-balancers', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#what-we-are-going-to-cover', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#prerequisites', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#step-1-perform-the-preliminary-setup', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#step-2-use-terraform-configuration-for-rke2-from-cloudferro-s-github-repository', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#step-3-provision-an-rke2-cluster', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#step-4-demonstrate-cloud-native-integration-covered-by-the-repo', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#implementation-details', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#further-customization', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html#what-to-do-next', but the target 'How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#how-the-upgrade-works-automatically-in-magnum', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#prerequisites', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#backup-and-observe-the-state-of-the-cluster-before-the-upgrade', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#prepare-the-upgrade', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#trigger-the-upgrade', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'kubernetes.md' contains a link 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html#verify-the-upgrade', but the target 'Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-can-I-access-my-VMs-using-names-instead-of-IP-addresses-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html#how-to-assign-a-floating-ip-to-your-vm', but the target 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html#how-to-disassociate-a-floating-ip', but the target 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html#how-to-release-a-floating-ip-return-it-to-the-pool', but the target 'How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'Cannot-access-VM-with-SSH-or-PING-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'Cannot-ping-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html#how-to-find-out-what-ip-address-is-attached-to-vm', but the target 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html#is-my-vm-visible-from-internet-without-floating-ip-assigned', but the target 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html#can-i-send-data-from-my-vm-without-a-floating-ip', but the target 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html#is-my-vm-accessible-from-the-outside-without-floating-ip', but the target 'How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-run-and-configure-Firewall-as-a-service-and-VPN-as-a-service-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html#step-1-preparation', but the target 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html#step-2-importing-a-key', but the target 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'networking.md' contains a link 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html#list-instances-in-your-project', but the target 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html#create-a-backup', but the target 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html#download-the-backup-file', but the target 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html#upload-the-backed-up-file', but the target 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#always-use-the-latest-value-of-image-id', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#basic-template-for-using-heat', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#typical-parts-of-a-heat-template', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#how-to-get-data-for-heat-template', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#using-heat-with-cli', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#using-heat-with-gui', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#create-four-vms-using-an-advanced-heat-template', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#default-elements-of-the-account', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#prerequisites', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#default-values-in-the-tenant-manager-account', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#create-a-new-project', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#step-1-create-project', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#step-2-add-external-network-to-the-project', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#step-3-add-security-group-to-the-project', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#step-4-create-network-with-router', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html#what-to-do-next', but the target 'How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html#what-are-we-going-to-do', but the target 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html#step-1-install-the-openstack-cli-client', but the target 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html#step-2-verify-whether-installation-was-successful', but the target 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-1-download-and-install-python', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-2-install-git-bash-and-pip', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-3-install-pip-and-update-the-pythonssl-certificates', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-4-install-microsoft-c-build-tools', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-5-install-virtualenv-and-the-openstack-cli-client', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-6-download-and-prepare-jq', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#step-7-install-and-configure-the-openstack-cli-client', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#reentering-the-isolated-python-environment', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#setting-up-the-test-example', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#download-the-rc-file-to-share-permissions-with-users', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#sharing-the-rc-file-with-the-users', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#owner-sources-the-rc-file', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#user-1-sources-the-rc-file', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#user-2-sources-the-rc-file', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#uploading-of-test-files', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#granting-access', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#what-we-are-going-to-cover', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#prerequisites', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#step-1-check-the-version-of-windows', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#step-2-install-ubuntu-on-windows-subsystem-for-linux', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#step-3-install-openstack-cli-in-an-isolated-python-environment', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#step-4-download-your-openstack-rc-file', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#step-5-move-the-rc-file-to-your-ubuntu-environment', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#how-to-run-this-environment-later', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html#what-to-do-next', but the target 'How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#ensure-that-the-transfer-is-possible', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#obtaining-information-about-the-volume', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#obtaining-information-about-the-virtual-machines', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#general-concerns-about-shutting-down-a-virtual-machine', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#shutting-down-the-source-virtual-machine-using-openstack-cli', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#disconnecting-volume', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#attaching-volume-to-the-destination-virtual-machine', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#how-to-install-swift', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#basic-openstack-commands-for-object-data', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#basic-openstack-cli-operations-with-containers', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#basic-openstack-cli-operations-with-objects', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#step-1-initiating-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#step-2-accepting-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#cancelling-transfer-of-volume', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#gathering-information-used-to-create-an-instance', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#creating-an-instance', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-can-go-wrong-when-recreating-instance-from-instance-snapshot', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#verifying-volumes-when-using-persistent-storage', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#the-plan', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#creating-a-snapshot-of-instance-which-uses-ephemeral-storage', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#snapshot-of-instance-which-uses-persistent-storage', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#introduction', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#prerequisites', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#creating-a-new-vm', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#steps-to-resize-the-vm', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#reverting-a-resize', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#the-rotating-backup-algorithm', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#backup-create-vs-image-create', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#prerequisites', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#create-the-first-backup', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#the-problems-and-shortcomings-of-backup-command', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#restoring-backups', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#backup-create-vs-image-create', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#prerequisites', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#the-rotating-backup-algorithm', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#creating-a-backup-manually-without-rotating', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#multiple-rotating-schedules', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#limitations', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#how-to-restore-backups', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#problems-and-troubleshooting', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_cli.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html#what-are-we-going-to-do', but the target 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html#prerequisites', but the target 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html#step-1-source-your-rc-file', but the target 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html#step-2-create-python-code-that-will-perform-keycloak-authentication-within-your-app', but the target 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html#step-3-use-the-code-in-your-app', but the target 'Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#what-we-are-going-to-do', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#prerequisites', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-1-install-terraform-as-a-root-user', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-2-reconnect-to-the-cloud', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-3-download-openstack-token', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-4-set-up-the-configuration-file-and-initialize-terraform', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-5-create-terraform-code', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#always-use-the-latest-value-of-image-id', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#the-meaning-of-the-variables-used', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#step-6-execute-the-terraform-script', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_dev.md' contains a link 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html#id1', but the target 'Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link 'What-is-an-OpenStack-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link 'What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/openstack-user-roles-create-4.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-2.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link 'How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-1.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-4.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-5.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-6.png', but the target is not found among documentation files. +WARNING - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '../_images/user-roles-list-create-3.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../cloud/How-to-use-Docker-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-2_16-7-51.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-2_16-11-43.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-2_16-36-11.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-2_16-44-28.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-3_14-41-56.png', but the target is not found among documentation files. +WARNING - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image2023-8-3_15-11-48.png', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link '../_images/register_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link '../_images/create_account_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link '../_images/registration_successful_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link 'Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link 'Adding-Editing-Organizations.html', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link 'Inviting-New-User.html', but the target is not found among documentation files. +WARNING - Doc file 'registration_and_setting_up_an_account.md' contains a link 'How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'removing_user_from_organization.md' contains a link '../_images/users_roles_01_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-cli-3.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-cli-2.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-cli-4.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link 'Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-1.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-2.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-3.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-4.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-5.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/fwaas-openvpn-v2-34.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-10.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-8.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../_images/resize-vm-horizon-7.png', but the target is not found among documentation files. +WARNING - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '../openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '../_images/s3-bucket-versioning-09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html', but the target is not found among documentation files. +WARNING - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-delete-large-S3-bucket-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#step-1-sign-in-to-your-linux-machine', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#step-2-install-s3fs', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#step-3-create-file-or-files-containing-login-credentials', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#step-4-create-mount-points', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#step-5-mount-a-container', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#unmounting-a-container', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#configuring-automatic-mounting-of-your-object-storage', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#stopping-automatic-mounting-of-a-container', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#potential-problems-with-the-way-s3fs-handles-objects', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#s3-bucket-policy', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#naming-conventions-used-in-this-document', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#limitations', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#s3cmd-configuration', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#declaring-bucket-policy', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#setting-a-policy-on-the-bucket', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html#sample-scenarios', but the target 'Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#creating-a-new-object-storage-container', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#viewing-the-container', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#creating-a-new-folder', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#navigating-through-folders', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#uploading-a-file', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#deleting-files-and-folders-from-a-container', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#recommended-number-of-files-in-your-object-storage-containers', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#working-with-public-object-storage-containers', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html#step-1-ensure-that-python3-is-preinstalled', but the target 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html#step-2-install-boto3-on-windows', but the target 'How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#introduction', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#requirements', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#rest-api', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#example-no-1-generate-header-values', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#example-no-2-aws-cli-s3api', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#example-no-3-aws-cli-s3', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#example-no-4-aws-cli-s3-blob', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html#downloading-the-encrypted-object', but the target 'Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#prerequisites', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#what-we-are-going-to-cover', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#software-tools-used-in-this-article-rclone-winfsp-and-nssm', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#how-to-use-the-rclone-configuration-file', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#step-1-download-and-install-the-appropriate-software', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#step-2-enter-the-connection-data', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#step-3-perform-a-test-mount', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#step-4-tweak-the-dir-cache-time-option', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#step-5-configure-automatic-mounting-of-your-container', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#removing-software-responsible-for-automatic-mounting-of-object-storage', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html#what-to-do-next', but the target 'How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html#prerequisites', but the target 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html#installing-s3cmd-using-apt', but the target 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html#uninstalling-s3cmd-using-apt', but the target 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#prerequisites', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#terminology-container-and-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#preparing-the-environment', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#how-to-use-the-examples-provided', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#running-python-code', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#creating-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#listing-buckets', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#checking-when-a-bucket-was-created', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#listing-files-in-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#listing-files-from-particular-path-in-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#uploading-file-to-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#downloading-file-from-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#removing-file-from-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#removing-a-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#general-troubleshooting', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html#what-to-do-next', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#what-we-are-going-to-cover', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#prerequisites', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#object-storage-vs-standard-file-system', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#terminology-container-and-bucket', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#configuring-s3cmd', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#s3-paths-in-s3cmd', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#listing-containers', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#creating-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#uploading-a-file-to-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#listing-files-and-folders-of-the-root-directory-of-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#listing-files-and-folders-not-in-the-root-directory-of-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#removing-a-file-from-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#downloading-a-file-from-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#checking-how-much-storage-is-being-used-on-a-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#removing-the-entire-container', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html#what-to-do-next', but the target 'How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#prerequisites', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#initializing-the-configuration-process', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#using-configure-on-an-existing-file', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#executing-s3-commands', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#creating-a-minimal-configuration-file-manually', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#maintaining-separate-s3cmd-configuration-files', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#prerequisites', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#configuring-and-testing-aws-cli', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#assigning-bucket-names-to-shell-variables', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#creating-a-bucket-without-versioning', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#enabling-versioning-on-a-bucket', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#uploading-file', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#s3-paths', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#uploading-another-version-of-a-file', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#listing-available-versions-of-a-file', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#downloading-a-chosen-version-of-the-file', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#deleting-objects-on-version-enabled-buckets', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#using-lifecycle-policy-to-configure-automatic-deletion-of-previous-versions-of-files', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#suspending-versioning', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 's3.md' contains a link 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'S3-bucket-object-versioning-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link 'Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-23_17-16-2.png', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-2024-5-23_17-39-37.png', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link '../_images/image-end-of-article.png', but the target is not found among documentation files. +WARNING - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link 'Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'server-side_encryption_with_customer-managed_keys_(sse-c)_on_cloudferro_cloud.md' contains a link 'How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'server-side_encryption_with_customer-managed_keys_(sse-c)_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'services.md' contains a link '../_images/services_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/waw3-2-cloud-activated.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link 'Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/flavors_listed_spot.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link 'How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/spot_flavors_when_creating.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/spot_hma_created.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/value_of_spot.png', but the target is not found among documentation files. +WARNING - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '../_images/resize_instance.png', but the target is not found among documentation files. +WARNING - Doc file 'status_power_state_and_dependencies_in_billing_of_instance_vms_on_cloudferro_cloud.md' contains a link '../_images/statuspower.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '../_images/Tenant_manager_01_cloudferro.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '../_images/Tenant_manager_02_cloudferro.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '../_images/Tenant_manager_03_cloudferro.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '../_images/Tenant_manager_04_cloudferro.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '../_images/Tenant_manager_05_cloudferro.png', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link 'Inviting-New-User.html', but the target is not found among documentation files. +WARNING - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link 'Removing-User-From-Organization.html', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link 'Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_07_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_09_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_10_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '../_images/keepassxc_11_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +INFO - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains an absolute link '/cdn-cgi/l/email-protection#05767075756a7771232636323e232630373e2326313d3e66696a7061636077776a232631333e666a68', it was left as is. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp01.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp01.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp02.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp02.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp03.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp03.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp04.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp04.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp05.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp05.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp07.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp07.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp08.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp08.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_freeotp_qr_icon.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_qr_screen_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_qr_screen_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp09.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/otp09.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_several_rows.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_several_rows.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_tapped.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_tapped.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_start_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_start_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_sign_regular_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_sign_regular_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_mobile_auth_setup_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_mobile_auth_setup_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_start_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_start_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_sign_regular_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_sign_regular_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_restart_login_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_restart_login_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_tapped.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_tapped.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_logged_in_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '../_images/eefa_logged_in_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link 'Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link 'How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link 'How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../_images/install-cron-1.png', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link 'How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../_images/how-to-create-rotating-backups-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '../_images/install-cron-2.png', but the target is not found among documentation files. +WARNING - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link 'Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link 'How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/install-cron-1.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-01_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-02_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/install-cron-mulitple-1.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-03_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-04_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/use-script-rotating-backups-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/backup-command-rotating-backups-05_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/backup-command-rotating-backups-06_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../_images/backup-command-rotating-backups-08_creodias.png', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '../cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link 'Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/dashboard_installed.png', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/new-s3cmd-download-69.png', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/starting_to_server.png', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/dashboard2.png', but the target is not found among documentation files. +WARNING - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/dashboard_view.png', but the target is not found among documentation files. +WARNING - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link 'How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link 'How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link '../networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link '../_images/apache_route.png', but the target is not found among documentation files. +WARNING - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link '../_images/any_other_route.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '../_images/volno1.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '../_images/volno2.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '../_images/volno3.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link 'VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '../_images/volno4.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '../_images/volno5.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes1.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes2.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes3.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes4.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes5.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes6.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes7.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes8.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes9.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes10.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes11.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes12.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes13.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes14.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes15.png', but the target is not found among documentation files. +WARNING - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '../_images/volyes16.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link 'How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/dockerspace_created.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/instances.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/volumes.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/nano_redis_yaml.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/redis-data.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/devvdb.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/instance.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/redis_kill.png', but the target is not found among documentation files. +WARNING - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '../_images/final_result.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../_images/volsnap1.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../_images/volsnap2.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../_images/volsnap3.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../_images/volsnap4.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../_images/volsnap5.png', but the target is not found among documentation files. +WARNING - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '../openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'wallets_and_contracts_management.md' contains a link '../_images/wallets_contracts_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'wallets_and_contracts_management.md' contains a link 'Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/accountmanagement.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Registration-And-Account.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/How-to-start-using-dashboard-services-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Two-Factor-Authentication-for-CloudFerro-Cloud-Site.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Using-KeePassXC-for-Two-Factor-Authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/How-to-activate-OpenStack-CLI-access-to-CloudFerro-Cloud-cloud-using-one-or-two-factor-authentication.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/How-to-manage-TOTP-authentication-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Adding-Editing-Organizations.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/How-to-buy-credits-using-pay-per-use-wallet-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Forgotten-Password.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Editing-Profile.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Contracts-Wallets.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Services.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Inviting-New-User.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Removing-User-From-Organization.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Tenant-Manager-Users-And-Roles-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Help-Desk-And-Support.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Privacy-Policy.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'accountmanagement/Cookie-consent-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/Dashboard-Overview-Project-Quotas-And-Flavors-Limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-access-the-VM-from-OpenStack-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-clone-existing-and-configured-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-fix-unresponsive-console-issue-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-generate-ec2-credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-generate-or-use-Application-Credentials-via-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-use-GUI-in-Linux-VM-on-CloudFerro-Cloud-and-access-it-from-local-Linux-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-To-Create-a-New-Linux-VM-With-NVIDIA-Virtual-GPU-in-the-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-use-Docker-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-use-Security-Groups-in-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-key-pair-in-OpenStack-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-new-Linux-VM-in-OpenStack-Dashboard-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-install-Python-virtualenv-or-virtualenvwrapper-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-start-a-VM-from-a-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/Status-Power-State-and-dependences-in-billing-of-instances-VMs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-upload-your-custom-image-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/VM-created-with-option-Create-New-Volume-No-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/VM-created-with-option-Create-New-Volume-Yes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/What-is-an-OpenStack-domain-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/What-is-an-OpenStack-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-a-Linux-VM-and-access-it-from-Windows-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-a-Linux-VM-and-access-it-from-Linux-command-line-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/DNS-as-a-Service-on-CloudFerro-Cloud-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/What-Image-Formats-are-available-in-OpenStack-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-upload-custom-image-to-CloudFerro-Cloud-cloud-using-OpenStack-Horizon-dashboard.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-Windows-VM-on-OpenStack-Horizon-and-access-it-via-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-transfer-volumes-between-domains-and-projects-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/Spot-instances-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-instance-snapshot-using-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-start-a-VM-from-instance-snapshot-using-Horizon-dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/How-to-create-a-VM-using-the-OpenStack-CLI-client-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/OpenStack-user-roles-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/Resizing-a-virtual-machine-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'cloud/Block-storage-and-object-storage-performance-limits-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/datavolume.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-attach-a-volume-to-VM-less-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-attach-a-volume-to-VM-more-than-2TB-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/Ephemeral-vs-Persistent-storage-option-Create-New-Volume-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-export-a-volume-over-NFS-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-export-a-volume-over-NFS-outside-of-a-project-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-extend-the-volume-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-mount-object-storage-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-move-data-volume-between-two-VMs-using-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-many-objects-can-I-put-into-Object-Storage-container-bucket-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-create-volume-Snapshot-and-attach-as-Volume-on-Linux-or-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/Volume-snapshot-inheritance-and-its-consequences-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-To-Create-Backup-Of-Your-Volume-From-Windows-Machine-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-To-Attach-Volume-To-Windows-VM-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-create-or-delete-volume-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/How-to-restore-volume-from-snapshot-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'datavolume/Bootable-versus-non-bootable-volumes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-to-Create-a-Kubernetes-Cluster-Using-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Default-Kubernetes-cluster-templates-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-To-Install-OpenStack-and-Magnum-Clients-for-Command-Line-Interface-to-CloudFerro-Cloud-Horizon.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-To-Use-Command-Line-Interface-for-Kubernetes-Clusters-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Using-Dashboard-To-Access-Kubernetes-Cluster-Post-Deployment-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-To-Create-API-Server-LoadBalancer-for-Kubernetes-Cluster-On-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Creating-Additional-Nodegroups-in-Kubernetes-Cluster-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Autoscaling-Kubernetes-Cluster-Resources-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Volume-based-vs-Ephemeral-based-Storage-for-Kubernetes-Clusters-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Backup-of-Kubernetes-Cluster-using-Velero.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Using-Kubernetes-Ingress-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Installing-JupyterHub-on-Magnum-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Install-and-run-Argo-Workflows-on-CloudFerro-Cloud-Magnum-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Installing-HashiCorp-Vault-on-CloudFerro-Cloud-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/HTTP-Request-based-Autoscaling-on-K8S-using-Prometheus-and-Keda-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Create-and-access-NFS-server-from-Kubernetes-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Deploy-Keycloak-on-Kubernetes-with-a-sample-app-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Install-and-run-Dask-on-a-Kubernetes-cluster-in-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Install-and-run-NooBaa-on-Kubernetes-cluster-in-single-and-multicloud-environment-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Private-container-registries-with-Harbor-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Deploying-vGPU-workloads-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Kubernetes-cluster-observability-with-Prometheus-and-Grafana-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Enable-Kubeapps-app-launcher-on-CloudFerro-Cloud-Magnum-Kubernetes-cluster.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Install-GitLab-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Sealed-Secrets-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/CICD-pipelines-with-GitLab-on-CloudFerro-Cloud-Kubernetes-building-a-Docker-image.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-to-create-Kubernetes-cluster-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/GitOps-with-Argo-CD-on-CloudFerro-Cloud-Kubernetes.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Horizon-and-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Configuring-IP-Whitelisting-for-OpenStack-Load-Balancer-using-Terraform-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Implementing-IP-Whitelisting-for-Load-Balancers-with-Security-Groups-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/How-to-install-Rancher-RKE2-Kubernetes-on-CloudFerro-Cloud-cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'kubernetes/Automatic-Kubernetes-cluster-upgrade-on-CloudFerro-Cloud-OpenStack-Magnum.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/networking.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-can-I-access-my-VMs-using-names-instead-of-IP-addresses-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-Add-or-Remove-Floating-IPs-to-your-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/Cannot-access-VM-with-SSH-or-PING-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/Cannot-ping-VM-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-connect-to-your-virtual-machine-via-SSH-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-can-I-open-new-ports-port-80-for-http-for-my-service-or-instance-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/Generating-a-SSH-keypair-in-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-add-SSH-key-from-Horizon-web-console-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-is-my-VM-visible-in-the-internet-with-no-Floating-IP-attached-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-run-and-configure-Firewall-as-a-service-and-VPN-as-a-service-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'networking/How-to-Import-SSH-Public-Key-to-OpenStack-Horizon-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/openstackcli.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-backup-an-instance-and-download-it-to-the-desktop-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-create-a-set-of-VMs-using-OpenStack-Heat-Orchestration-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-To-Create-and-Configure-New-Project-on-CloudFerro-Cloud-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-install-OpenStackClient-for-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-install-OpenStackClient-GitBash-or-Cygwin-for-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-share-private-container-from-object-storage-to-another-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-install-OpenStackClient-on-Windows-using-Windows-Subsystem-for-Linux-on-CloudFerro-Cloud-OpenStack-Hosting.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-move-data-volume-between-two-VMs-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-transfer-volumes-between-domains-and-projects-using-OpenStack-CLI-client-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-start-a-VM-from-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/How-to-create-instance-snapshot-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/Resizing-a-virtual-machine-using-OpenStack-CLI-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/Use-backup-command-to-create-rotating-backups-of-virtual-machines-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackcli/Use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-using-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackdev/openstackdev.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackdev/Authenticating-to-OpenstackSDK-using-Keycloak-Credentials-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'openstackdev/Generating-and-authorizing-Terraform-using-Keycloak-user-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/s3.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-delete-large-S3-bucket-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-mount-object-storage-container-as-a-file-system-in-Linux-using-s3fs-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/Bucket-sharing-using-s3-bucket-policy-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-use-Object-Storage-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-access-private-object-storage-using-S3cmd-or-boto3-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-To-Install-boto3-In-Windows-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/Server-Side-Encryption-with-Customer-Managed-Keys-SSE-C-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-mount-object-storage-container-from-CloudFerro-Cloud-as-file-system-on-local-Windows-computer.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-install-s3cmd-on-Linux-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-access-object-storage-from-CloudFerro-Cloud-using-boto3.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/How-to-access-object-storage-from-CloudFerro-Cloud-using-s3cmd.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/Configuration-files-for-s3cmd-command-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 's3/S3-bucket-object-versioning-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/windows.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'windows/How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'welcome_to_cloudferro_cloud_documentation.md' contains a link 'releasenotes/releasenotes.html', but the target is not found among documentation files. +WARNING - Doc file 'what_is_an_openstack_domain_on_cloudferro_cloud.md' contains a link 'cloud/domain_cloudferrocloud.png', but the target is not found among documentation files. +WARNING - Doc file 'what_is_an_openstack_project_on_cloudferro_cloud.md' contains a link '../_images/project1.png', but the target is not found among documentation files. +WARNING - Doc file 'what_is_an_openstack_project_on_cloudferro_cloud.md' contains a link '../_images/project2.png', but the target is not found among documentation files. +WARNING - Doc file 'what_is_an_openstack_project_on_cloudferro_cloud.md' contains a link '../networking/How-to-create-a-network-with-router-in-Horizon-Dashboard-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-to-access-a-VM-from-Windows-PuTTY-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html#requirements', but the target 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html#step-1-information-required-to-establish-connection-with-the-bastion-host', but the target 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html#step-2-open-connection-in-putty', but the target 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html#step-3-start-an-rdp-session-to-localhost-to-reach-the-destination-server', but the target 'Connecting-to-a-Windows-VM-via-RDP-through-a-Linux-bastion-host-port-forwarding-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html#requirements', but the target 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html#step-1-go-to-the-folder-containing-your-ssh-keys', but the target 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html#step-2-connect-to-your-vm-using-ssh', but the target 'How-to-connect-to-a-virtual-machine-via-SSH-from-Windows-10-Command-Prompt-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html#prerequisites', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html#step-1-verify-if-openssh-client-is-installed', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html#step-2-open-command-prompt', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html#step-3-use-openssh-to-generate-an-ssh-key-pair', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html#what-we-are-going-to-cover', but the target 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html#prerequisites', but the target 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html#step-1-microsoft-management-console-mmc', but the target 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html#step-2-create-and-configure-a-user-account', but the target 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html#what-to-do-next', but the target 'Can-I-change-my-password-through-RDP-on-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html', but the target is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#prerequisites', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#step-1-verify-whether-openssh-client-is-installed', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#step-2-install-openssh', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#step-3-use-ssh-keygen-to-generate-an-ssh-key-pair', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#step-4-see-generated-key-pair', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +WARNING - Doc file 'windows.md' contains a link 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html#what-to-do-next', but the target 'How-To-Create-SSH-Key-Pair-In-Windows-11-On-CloudFerro-Cloud.html' is not found among documentation files. +INFO - Doc file 'authenticating_with_openstacksdk_using_keycloak_credentials_on_cloudferro_cloud.md' contains a link '#authenticating-with-openstacksdk-using-keycloak-credentials-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#automatic-kubernetes-cluster-upgrade-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id2', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id3', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id4', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id5', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id6', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id7', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id8', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id9', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id10', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id11', but there is no such anchor on this page. +INFO - Doc file 'automatic_kubernetes_cluster_upgrade_on_cloudferro_cloud_openstack_magnum.md' contains a link '#id12', but there is no such anchor on this page. +INFO - Doc file 'autoscaling_kubernetes_cluster_resources_on_cloudferro_cloud_openstack_magnum.md' contains a link '#autoscaling-kubernetes-cluster-resources-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'backup_of_kubernetes_cluster_using_velero.md' contains a link '#installation-step-2-adjust-the-configuration-file-values-yaml', but there is no such anchor on this page. +INFO - Doc file 'block_storage_and_object_storage_performance_limits_on_cloudferro_cloud.md' contains a link '#block-storage-and-object-storage-performance-limits-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'bootable_versus_non-bootable_volumes_on_cloudferro_cloud.md' contains a link '#bootable-versus-non-bootable-volumes-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link '#bucket-sharing-using-s3-bucket-policy-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link '#policy-json-file-s-sections', but there is no such anchor on this page. +INFO - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link '#key-specification', but there is no such anchor on this page. +INFO - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link '#grant-read-write-access-to-a-bucket-user-using-his-project-id', but there is no such anchor on this page. +INFO - Doc file 'bucket_sharing_using_s3_bucket_policy_on_cloudferro_cloud.md' contains a link '#limit-read-write-access-to-a-bucket-to-users-accessing-from-specific-ip-address-range', but there is no such anchor on this page. +INFO - Doc file 'can_i_change_my_password_through_rdp_on_cloudferro_cloud.md' contains a link '#can-i-change-my-password-through-rdp-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'cannot_access_vm_with_ssh_or_ping_on_cloudferro_cloud.md' contains a link '#cannot-access-vm-with-ssh-or-ping-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'cannot_ping_vm_on_cloudferro_cloud.md' contains a link '#cannot-ping-vm-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '#ci-cd-pipelines-with-gitlab-on-brand-name-kubernetes-building-a-docker-image', but there is no such anchor on this page. +INFO - Doc file 'ci_cd_pipelines_with_gitlab_on_cloudferro_cloud_kubernetes_-_building_a_docker_image.md' contains a link '#step-4-create-a-pipeline-to-build-your-app-s-docker-image-using-kaniko', but there is no such anchor on this page. +INFO - Doc file 'configuration_files_for_s3cmd_command_on_cloudferro_cloud.md' contains a link '#configuration-files-for-s3cmd-command-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_horizon_and_cli_on_cloudferro_cloud.md' contains a link '#configuring-ip-whitelisting-for-openstack-load-balancer-using-horizon-and-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'configuring_ip_whitelisting_for_openstack_load_balancer_using_terraform_on_cloudferro_cloud.md' contains a link '#configuring-ip-whitelisting-for-openstack-load-balancer-using-terraform-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'connecting_to_a_windows_vm_via_rdp_through_a_linux_bastion_host_port_forwarding_on_cloudferro_cloud.md' contains a link '#connecting-to-a-windows-vm-via-rdp-through-a-linux-bastion-host-port-forwarding-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '#cookie-consent-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'cookie_consent_on_cloudferro_cloud.md' contains a link '#setting-up-cookies-on-brand-name-subdomains', but there is no such anchor on this page. +INFO - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '#create-and-access-nfs-server-from-kubernetes-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '#set-up-nfs-server-on-a-vm', but there is no such anchor on this page. +INFO - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '#set-up-a-share-folder-on-the-nfs-server', but there is no such anchor on this page. +INFO - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '#make-the-share-available', but there is no such anchor on this page. +INFO - Doc file 'create_and_access_nfs_server_from_kubernetes_on_cloudferro_cloud.md' contains a link '#deploy-a-test-pod-on-the-cluster', but there is no such anchor on this page. +INFO - Doc file 'creating_additional_nodegroups_in_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '#creating-additional-nodegroups-in-kubernetes-cluster-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'dashboard_overview_–_project_quotas_and_flavors_limits_on_cloudferro_cloud.md' contains a link '#dashboard-overview-project-quotas-and-flavors-limits-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'default_kubernetes_cluster_templates_in_cloudferro_cloud_cloud.md' contains a link '#default-kubernetes-cluster-templates-in-brand-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'deploy_keycloak_on_kubernetes_with_a_sample_app_on_cloudferro_cloud.md' contains a link '#deploy-keycloak-on-kubernetes-with-a-sample-app-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'deploying_helm_charts_on_magnum_kubernetes_clusters_on_cloudferro_cloud___cloud.md' contains a link '#deploying-helm-charts-on-magnum-kubernetes-clusters-on-brand-name-cloud-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link '#deploying-https-services-on-magnum-kubernetes-in-brand-name-cloud-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'deploying_https_services_on_magnum_kubernetes_in_cloudferro_cloud___cloud.md' contains a link '#step-1-install-cert-manager-s-custom-resource-definitions-crds', but there is no such anchor on this page. +INFO - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '#deploying-vgpu-workloads-on-brand-name-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'deploying_vgpu_workloads_on_cloudferro_cloud_kubernetes.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '#dns-as-a-service-on-brand-name-cloud-name-hosting', but there is no such anchor on this page. +INFO - Doc file 'dns_as_a_service_on_cloudferro_cloud___hosting.md' contains a link '#step-1-delegate-domain-to-your-registrar-s-system', but there is no such anchor on this page. +INFO - Doc file 'enable_kubeapps_app_launcher_on_cloudferro_cloud_magnum_kubernetes_cluster.md' contains a link '#enable-kubeapps-app-launcher-on-brand-name-magnum-kubernetes-cluster', but there is no such anchor on this page. +INFO - Doc file 'ephemeral_vs_persistent_storage_option_create_new_volume_on_cloudferro_cloud.md' contains a link '#ephemeral-vs-persistent-storage-option-create-new-volume-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'generating_an_ssh_keypair_in_linux_on_cloudferro_cloud.md' contains a link '#generating-an-ssh-keypair-in-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '#generating-and-authorizing-terraform-using-keycloak-user-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'generating_and_authorizing_terraform_using_keycloak_user_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'gitops_with_argo_cd_on_cloudferro_cloud_kubernetes.md' contains a link '#gitops-with-argo-cd-on-brand-name-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'how_can_i_access_my_vms_using_names_instead_of_ip_addresses_on_cloudferro_cloud.md' contains a link '#how-can-i-access-my-vms-using-names-instead-of-ip-addresses-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_can_i_open_new_ports_for_http_for_my_service_or_instance_on_cloudferro_cloud.md' contains a link '#how-can-i-open-new-ports-for-http-for-my-service-or-instance-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_is_my_vm_visible_in_the_internet_with_no_floating_ip_attached_on_cloudferro_cloud.md' contains a link '#how-is-my-vm-visible-in-the-internet-with-no-floating-ip-attached-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_many_objects_can_i_put_into_object_storage_container_bucket_on_cloudferro_cloud.md' contains a link '#how-many-objects-can-i-put-into-object-storage-container-bucket-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_a_vm_from_windows_putty_on_cloudferro_cloud.md' contains a link '#how-to-access-a-vm-from-windows-putty-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_kubernetes_cluster_post_deployment_using_kubectl_on_cloudferro_cloud_openstack_magnum.md' contains a link '#how-to-access-kubernetes-cluster-post-deployment-using-kubectl-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '#how-to-access-object-storage-from-brand-name-using-boto3', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '#ubuntu-22-04', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_boto3.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link '#how-to-access-object-storage-from-brand-name-using-s3cmd', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_from_cloudferro_cloud_using_s3cmd.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_object_storage_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#how-to-access-object-storage-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_private_object_storage_using_s3cmd_or_boto3_on_cloudferro_cloud.md' contains a link '#how-to-access-private-object-storage-using-s3cmd-or-boto3-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_access_the_vm_from_openstack_console_on_cloudferro_cloud.md' contains a link '#how-to-access-the-vm-from-openstack-console-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '#how-to-activate-openstack-cli-access-to-brand-name-cloud-using-one-or-two-factor-authentication', but there is no such anchor on this page. +INFO - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '#fa-accounts-entering-a-wrong-password-and-or-six-digit-code', but there is no such anchor on this page. +INFO - Doc file 'how_to_activate_openstack_cli_access_to_cloudferro_cloud_cloud_using_one-_or_two-factor_authentication.md' contains a link '#fa-accounts-lost-internet-connection', but there is no such anchor on this page. +INFO - Doc file 'how_to_add_or_remove_floating_ip’s_to_your_vm_on_cloudferro_cloud.md' contains a link '#how-to-add-or-remove-floating-ips-to-your-vm-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_add_ssh_key_from_horizon_web_console_on_cloudferro_cloud.md' contains a link '#how-to-add-ssh-key-from-horizon-web-console-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_attach_a_volume_to_vm_less_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '#how-to-attach-a-volume-to-vm-less-than-2tb-on-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_attach_a_volume_to_vm_more_than_2tb_on_linux_on_cloudferro_cloud.md' contains a link '#how-to-attach-a-volume-to-vm-more-than-2tb-on-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_attach_volume_to_windows_vm_on_cloudferro_cloud.md' contains a link '#how-to-attach-volume-to-windows-vm-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_backup_an_instance_and_download_it_to_the_desktop_on_cloudferro_cloud_openstack_hosting.md' contains a link '#how-to-backup-an-instance-and-download-it-to-the-desktop-on-brand-name-openstack-hosting', but there is no such anchor on this page. +INFO - Doc file 'how_to_buy_credits_using_pay_per_use_wallet_on_cloudferro_cloud.md' contains a link '#how-to-buy-credits-using-pay-per-use-wallet-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_clone_existing_and_configured_vms_on_cloudferro_cloud.md' contains a link '#how-to-clone-existing-and-configured-vms-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_connect_to_a_virtual_machine_via_ssh_from_windows_10_command_prompt_on_cloudferro_cloud.md' contains a link '#how-to-connect-to-a-virtual-machine-via-ssh-from-windows-10-command-prompt-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_connect_to_your_virtual_machine_via_ssh_in_linux_on_cloudferro_cloud.md' contains a link '#how-to-connect-to-your-virtual-machine-via-ssh-in-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_kubernetes_cluster_using_cloudferro_cloud_openstack_magnum.md' contains a link '#how-to-create-a-kubernetes-cluster-using-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_linux_vm_and_access_it_from_linux_command_line_on_cloudferro_cloud.md' contains a link '#how-to-create-a-linux-vm-and-access-it-from-linux-command-line-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_linux_vm_and_access_it_from_windows_desktop_on_cloudferro_cloud.md' contains a link '#how-to-create-a-linux-vm-and-access-it-from-windows-desktop-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_network_with_router_in_horizon_dashboard_on_cloudferro_cloud.md' contains a link '#how-to-create-a-network-with-router-in-horizon-dashboard-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_new_linux_vm_with_nvidia_virtual_gpu_in_the_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '#how-to-create-a-new-linux-vm-with-nvidia-virtual-gpu-in-the-openstack-dashboard-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_set_of_vms_using_openstack_heat_orchestration_on_cloudferro_cloud.md' contains a link '#how-to-create-a-set-of-vms-using-openstack-heat-orchestration-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_a_vm_using_the_openstack_cli_client_on_cloudferro_cloud_cloud.md' contains a link '#how-to-create-a-vm-using-the-openstack-cli-client-on-brand-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_and_configure_new_openstack_project_through_horizon_on_cloudferro_cloud___cloud.md' contains a link '#how-to-create-and-configure-new-openstack-project-through-horizon-on-brand-name-cloud-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '#how-to-create-api-server-loadbalancer-for-kubernetes-cluster-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_api_server_loadbalancer_for_kubernetes_cluster_on_cloudferro_cloud_openstack_magnum.md' contains a link '#step-4-add-parameter-insecure-skip-tls-verify-true-to-make-kubectl-work', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_backup_of_your_volume_from_windows_machine_on_cloudferro_cloud.md' contains a link '#how-to-create-backup-of-your-volume-from-windows-machine-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '#how-to-create-instance-snapshot-using-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '#id2', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_horizon_on_cloudferro_cloud.md' contains a link '#id3', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#how-to-create-instance-snapshot-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_key_pair_in_openstack_dashboard_on_cloudferro_cloud.md' contains a link '#how-to-create-key-pair-in-openstack-dashboard-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_kubernetes_cluster_using_terraform_on_cloudferro_cloud.md' contains a link '#how-to-create-kubernetes-cluster-using-terraform-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '#how-to-create-new-linux-vm-in-openstack-dashboard-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_new_linux_vm_in_openstack_dashboard_horizon_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_or_delete_volume_snapshot_on_cloudferro_cloud.md' contains a link '#how-to-create-or-delete-volume-snapshot-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_ssh_key_pair_in_windows_10_on_cloudferro_cloud.md' contains a link '#how-to-create-ssh-key-pair-in-windows-10-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_ssh_key_pair_in_windows_11_on_cloudferro_cloud.md' contains a link '#how-to-create-ssh-key-pair-in-windows-11-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_volume_snapshot_and_attach_as_volume_on_linux_or_windows_on_cloudferro_cloud.md' contains a link '#how-to-create-volume-snapshot-and-attach-as-volume-on-linux-or-windows-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_create_windows_vm_on_openstack_horizon_and_access_it_via_web_console_on_cloudferro_cloud.md' contains a link '#how-to-create-windows-vm-on-openstack-horizon-and-access-it-via-web-console-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_delete_large_s3_bucket_on_cloudferro_cloud.md' contains a link '#how-to-delete-large-s3-bucket-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_export_a_volume_over_nfs_on_cloudferro_cloud.md' contains a link '#how-to-export-a-volume-over-nfs-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_export_a_volume_over_nfs_outside_of_a_project_on_cloudferro_cloud.md' contains a link '#how-to-export-a-volume-over-nfs-outside-of-a-project-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_extend_the_volume_in_linux_on_cloudferro_cloud.md' contains a link '#how-to-extend-the-volume-in-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_fix_unresponsive_console_issue_on_cloudferro_cloud.md' contains a link '#how-to-fix-unresponsive-console-issue-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_generate_and_manage_ec2_credentials_on_cloudferro_cloud.md' contains a link '#how-to-generate-and-manage-ec2-credentials-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '#how-to-generate-or-use-application-credentials-via-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '#step-4-enter-id-and-secret-into-clouds-yml', but there is no such anchor on this page. +INFO - Doc file 'how_to_generate_or_use_application_credentials_via_cli_on_cloudferro_cloud.md' contains a link '#step-5-gain-access-to-the-cloud-by-specifying-os-cloud-or-os-cloud', but there is no such anchor on this page. +INFO - Doc file 'how_to_import_ssh_public_key_to_openstack_horizon_on_cloudferro_cloud.md' contains a link '#how-to-import-ssh-public-key-to-openstack-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '#how-to-install-and-use-docker-on-ubuntu-24-04', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_and_use_docker_on_ubuntu_24.04.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_boto3_in_windows_on_cloudferro_cloud.md' contains a link '#how-to-install-boto3-in-windows-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_openstack_and_magnum_clients_for_command_line_interface_to_cloudferro_cloud_horizon.md' contains a link '#how-to-install-openstack-and-magnum-clients-for-command-line-interface-to-brand-name-horizon', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_openstackclient_for_linux_on_cloudferro_cloud.md' contains a link '#how-to-install-openstackclient-for-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_openstackclient_gitbash_for_windows_on_cloudferro_cloud.md' contains a link '#how-to-install-openstackclient-gitbash-for-windows-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_openstackclient_on_windows_using_windows_subsystem_for_linux_on_cloudferro_cloud_openstack_hosting.md' contains a link '#how-to-install-openstackclient-on-windows-using-windows-subsystem-for-linux-on-brand-name-openstack-hosting', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_python_virtualenv_or_virtualenvwrapper_on_cloudferro_cloud.md' contains a link '#how-to-install-python-virtualenv-or-virtualenvwrapper-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '#how-to-install-rancher-rke2-kubernetes-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '#step-2-use-terraform-configuration-for-rke2-from-cloudferro-s-github-repository', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_rancher_rke2_kubernetes_on_cloudferro_cloud.md' contains a link '#enter-data-in-file-terraform-tfvars', but there is no such anchor on this page. +INFO - Doc file 'how_to_install_s3cmd_on_linux_on_cloudferro_cloud.md' contains a link '#how-to-install-s3cmd-on-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_manage_totp_authentication_on_cloudferro_cloud.md' contains a link '#how-to-manage-totp-authentication-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_mount_object_storage_container_as_a_file_system_in_linux_using_s3fs_on_cloudferro_cloud.md' contains a link '#how-to-mount-object-storage-container-as-a-file-system-in-linux-using-s3fs-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_mount_object_storage_container_from_cloudferro_cloud_as_file_system_on_local_windows_computer.md' contains a link '#how-to-mount-object-storage-container-from-brand-name-as-file-system-on-local-windows-computer', but there is no such anchor on this page. +INFO - Doc file 'how_to_mount_object_storage_in_linux_on_cloudferro_cloud.md' contains a link '#how-to-mount-object-storage-in-linux-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_move_data_volume_between_two_vms_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '#how-to-move-data-volume-between-two-vms-using-openstack-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_move_data_volume_between_vms_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#how-to-move-data-volume-between-vms-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_restore_volume_from_snapshot_on_cloudferro_cloud.md' contains a link '#how-to-restore-volume-from-snapshot-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_run_and_configure_firewall_as_a_service_and_vpn_as_a_service_on_cloudferro_cloud.md' contains a link '#how-to-run-and-configure-firewall-as-a-service-and-vpn-as-a-service-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '#how-to-share-private-container-from-object-storage-to-another-user-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '#user-1-sources-the-rc-file', but there is no such anchor on this page. +INFO - Doc file 'how_to_share_private_container_from_object_storage_to_another_user_on_cloudferro_cloud.md' contains a link '#user-2-sources-the-rc-file', but there is no such anchor on this page. +INFO - Doc file 'how_to_start_a_vm_from_a_snapshot_on_cloudferro_cloud.md' contains a link '#how-to-start-a-vm-from-a-snapshot-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '#how-to-start-a-vm-from-instance-snapshot-using-horizon-dashboard-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_start_a_vm_from_instance_snapshot_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#how-to-start-a-vm-from-instance-snapshot-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_start_using_dashboard_services_on_cloudferro_cloud.md' contains a link '#how-to-start-using-dashboard-services-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_horizon_dashboard_on_cloudferro_cloud.md' contains a link '#how-to-transfer-volumes-between-domains-and-projects-using-horizon-dashboard-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_transfer_volumes_between_domains_and_projects_using_openstack_cli_client_on_cloudferro_cloud.md' contains a link '#how-to-transfer-volumes-between-domains-and-projects-using-openstack-cli-client-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_upload_custom_image_to_cloudferro_cloud_cloud_using_openstack_horizon_dashboard.md' contains a link '#how-to-upload-custom-image-to-brand-name-cloud-using-openstack-horizon-dashboard', but there is no such anchor on this page. +INFO - Doc file 'how_to_upload_your_custom_image_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#how-to-upload-your-custom-image-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_use_command_line_interface_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '#how-to-use-command-line-interface-for-kubernetes-clusters-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'how_to_use_gui_in_linux_vm_on_cloudferro_cloud_and_access_it_from_local_linux_computer.md' contains a link '#how-to-use-gui-in-linux-vm-on-brand-name-and-access-it-from-local-linux-computer', but there is no such anchor on this page. +INFO - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '#how-to-use-object-storage-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'how_to_use_object_storage_on_cloudferro_cloud.md' contains a link '#deleting-multiple-files-and-or-folders', but there is no such anchor on this page. +INFO - Doc file 'how_to_use_security_groups_in_horizon_on_cloudferro_cloud.md' contains a link '#how-to-use-security-groups-in-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'http_request-based_autoscaling_on_k8s_using_prometheus_and_keda_on__cloudferro_cloud.md' contains a link '#http-request-based-autoscaling-on-k8s-using-prometheus-and-keda-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '#implementing-ip-whitelisting-for-load-balancers-with-security-groups-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'implementing_ip_whitelisting_for_load_balancers_with_security_groups_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'install_and_run_argo_workflows_on_cloudferro_cloud___magnum_kubernetes.md' contains a link '#install-and-run-argo-workflows-on-brand-name-cloud-name-magnum-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'install_and_run_dask_on_a_kubernetes_cluster_in_cloudferro_cloud_cloud.md' contains a link '#install-and-run-dask-on-a-kubernetes-cluster-in-brand-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'install_and_run_noobaa_on_kubernetes_cluster_in_single-_and_multicloud-environment_on_cloudferro_cloud.md' contains a link '#install-and-run-noobaa-on-kubernetes-cluster-in-single-and-multicloud-environment-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'install_gitlab_on_cloudferro_cloud_kubernetes.md' contains a link '#install-gitlab-on-brand-name-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'installing_hashicorp_vault_on_cloudferro_cloud___magnum.md' contains a link '#installing-hashicorp-vault-on-brand-name-cloud-name-magnum', but there is no such anchor on this page. +INFO - Doc file 'installing_jupyterhub_on_magnum_kubernetes_cluster_in_cloudferro_cloud___cloud.md' contains a link '#installing-jupyterhub-on-magnum-kubernetes-cluster-in-brand-name-cloud-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '#kubernetes-cluster-observability-with-prometheus-and-grafana-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '#install-prometheus-with-helm', but there is no such anchor on this page. +INFO - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '#install-grafana', but there is no such anchor on this page. +INFO - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '#add-prometheus-as-datasource-to-grafana', but there is no such anchor on this page. +INFO - Doc file 'kubernetes_cluster_observability_with_prometheus_and_grafana_on_cloudferro_cloud.md' contains a link '#add-cluster-observability-dashboard', but there is no such anchor on this page. +INFO - Doc file 'openstack_user_roles_on_cloudferro_cloud.md' contains a link '#openstack-user-roles-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '#private-container-registries-with-harbor-on-brand-name-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '#associate-the-a-record-of-your-domain-to-harbor-s-ip-address', but there is no such anchor on this page. +INFO - Doc file 'private_container_registries_with_harbor_on_cloudferro_cloud_kubernetes.md' contains a link '#ensure-docker-trust-step-2-ensure-docker-trusts-the-harbor-s-certificate-authority', but there is no such anchor on this page. +INFO - Doc file 'resizing_a_virtual_machine_using_openstack_cli_on_cloudferro_cloud.md' contains a link '#resizing-a-virtual-machine-using-openstack-cli-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'resizing_a_virtual_machine_using_openstack_horizon_on_cloudferro_cloud.md' contains a link '#resizing-a-virtual-machine-using-openstack-horizon-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '#s3-bucket-object-versioning-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '#id2', but there is no such anchor on this page. +INFO - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '#id3', but there is no such anchor on this page. +INFO - Doc file 's3_bucket_object_versioning_on_cloudferro_cloud.md' contains a link '#id4', but there is no such anchor on this page. +INFO - Doc file 'sealed_secrets_on_cloudferro_cloud_kubernetes.md' contains a link '#sealed-secrets-on-brand-name-kubernetes', but there is no such anchor on this page. +INFO - Doc file 'server-side_encryption_with_customer-managed_keys_(sse-c)_on_cloudferro_cloud.md' contains a link '#server-side-encryption-with-customer-managed-keys-sse-c-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'spot_instances_on_cloudferro_cloud.md' contains a link '#spot-instances-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'status_power_state_and_dependencies_in_billing_of_instance_vms_on_cloudferro_cloud.md' contains a link '#status-power-state-and-dependencies-in-billing-of-instance-vms-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '#tenant-manager-users-and-roles-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'tenant_manager_users_and_roles_on_cloudferro_cloud.md' contains a link '#differences-between-openstack-user-roles-and-tenant-manager-s-roles', but there is no such anchor on this page. +INFO - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_keepassxc_on_desktop.md' contains a link '#two-factor-authentication-to-brand-name-site-using-keepassxc-on-desktop', but there is no such anchor on this page. +INFO - Doc file 'two-factor_authentication_to_cloudferro_cloud_site_using_mobile_application.md' contains a link '#two-factor-authentication-to-brand-name-site-using-mobile-application', but there is no such anchor on this page. +INFO - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '#use-backup-command-to-create-rotating-backups-of-virtual-machines-on-brand-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'use_backup_command_to_create_rotating_backups_of_virtual_machines_on_cloudferro_cloud_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '#use-script-to-create-daily-weekly-and-monthly-rotating-backups-of-virtual-machines-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'use_script_to_create_daily_weekly_and_monthly_rotating_backups_of_virtual_machines_on_cloudferro_cloud.md' contains a link '#id1', but there is no such anchor on this page. +INFO - Doc file 'using_dashboard_to_access_kubernetes_cluster_post_deployment_on_cloudferro_cloud_openstack_magnum.md' contains a link '#using-dashboard-to-access-kubernetes-cluster-post-deployment-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'using_kubernetes_ingress_on_cloudferro_cloud___openstack_magnum.md' contains a link '#using-kubernetes-ingress-on-brand-name-cloud-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'vm_created_with_option_create_new_volume_no_on_cloudferro_cloud.md' contains a link '#vm-created-with-option-create-new-volume-no-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'vm_created_with_option_create_new_volume_yes_on_cloudferro_cloud.md' contains a link '#vm-created-with-option-create-new-volume-yes-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'volume-based_vs_ephemeral-based_storage_for_kubernetes_clusters_on_cloudferro_cloud_openstack_magnum.md' contains a link '#volume-based-vs-ephemeral-based-storage-for-kubernetes-clusters-on-brand-name-openstack-magnum', but there is no such anchor on this page. +INFO - Doc file 'volume_snapshot_inheritance_and_its_consequences_on_cloudferro_cloud.md' contains a link '#volume-snapshot-inheritance-and-its-consequences-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'what_image_formats_are_available_in_openstack_cloudferro_cloud_cloud.md' contains a link '#what-image-formats-are-available-in-openstack-brand-name-cloud', but there is no such anchor on this page. +INFO - Doc file 'what_is_an_openstack_domain_on_cloudferro_cloud.md' contains a link '#what-is-an-openstack-domain-on-brand-name', but there is no such anchor on this page. +INFO - Doc file 'what_is_an_openstack_project_on_cloudferro_cloud.md' contains a link '#what-is-an-openstack-project-on-brand-name', but there is no such anchor on this page. +INFO - Documentation built in 2.40 seconds diff --git a/scrape_docs.py b/scrape_docs.py new file mode 100644 index 0000000..edf3110 --- /dev/null +++ b/scrape_docs.py @@ -0,0 +1,83 @@ +import os +import requests +from bs4 import BeautifulSoup +from urllib.parse import urljoin, urlparse, urlunparse +from markdownify import markdownify as md + +BASE_URL = "https://docs.cloudferro.com/en/latest/" +OUTPUT_DIR = "docs" +IMAGES_DIR = os.path.join(OUTPUT_DIR, "_images") +visited = set() + +def normalize_url(url): + parsed = urlparse(url) + # Remove query and fragment, normalize path + path = parsed.path.rstrip("/") + if path == "": + path = "/" + normalized = urlunparse((parsed.scheme, parsed.netloc, path, '', '', '')) + return normalized + +def download_image(img_url): + os.makedirs(IMAGES_DIR, exist_ok=True) + filename = os.path.basename(urlparse(img_url).path) + local_path = os.path.join(IMAGES_DIR, filename) + if not os.path.exists(local_path): + try: + r = requests.get(img_url, timeout=10) + r.raise_for_status() + with open(local_path, "wb") as f: + f.write(r.content) + except Exception as e: + print(f"Failed to download {img_url}: {e}") + return f"_images/{filename}" + +def process_page(url, rel_path): + print(f"Processing: {url}") + r = requests.get(url) + soup = BeautifulSoup(r.text, "html.parser") + # Download images and update src + for img in soup.find_all("img"): + img_url = urljoin(url, img["src"]) + local_img = download_image(img_url) + img["src"] = local_img + # Convert to Markdown + main = soup.find("main") or soup.body + md_content = md(str(main)) + # Save Markdown + out_path = os.path.join(OUTPUT_DIR, rel_path) + os.makedirs(os.path.dirname(out_path), exist_ok=True) + with open(out_path, "w", encoding="utf-8") as f: + f.write(md_content) + +def crawl_iterative(start_url, start_rel_path="index.md"): + stack = [(start_url, start_rel_path)] + while stack: + url, rel_path = stack.pop() + norm_url = normalize_url(url) + if norm_url in visited: + continue + visited.add(norm_url) + process_page(url, rel_path) + try: + r = requests.get(url) + soup = BeautifulSoup(r.text, "html.parser") + for a in soup.find_all("a", href=True): + href = a["href"] + if href.startswith("http") and not href.startswith(BASE_URL): + continue + abs_url = urljoin(url, href) + norm_abs_url = normalize_url(abs_url) + if norm_abs_url.startswith(BASE_URL.rstrip("/")) and norm_abs_url not in visited: + path = urlparse(abs_url).path.replace("/en/latest/", "") + if path.endswith("/") or path == "": + rel_md = os.path.join(path, "index.md") + else: + rel_md = path.rstrip("/") + ".md" + stack.append((abs_url, rel_md.lstrip("/"))) + except Exception as e: + print(f"Failed to process links on {url}: {e}") + +if __name__ == "__main__": + crawl_iterative(BASE_URL) + print("Scraping complete. All Markdown and images are in the 'docs/' folder.")