diff --git a/404.html b/404.html index 5e6d58227b..9d62679cc3 100644 --- a/404.html +++ b/404.html @@ -9,8 +9,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/about_our_contributors/index.html b/about_our_contributors/index.html index a8c02a0cc4..74ea25bb18 100644 --- a/about_our_contributors/index.html +++ b/about_our_contributors/index.html @@ -9,8 +9,8 @@ - - + +
Skip to main content

Below is a list of contibutors who have contributed to the @@ -106,6 +106,6 @@

Organisations employing contributors

  • Institut Teknologi Bandung (Indonesia)
  • Universität Hamburg (Germany)
  • Brazilian Center for Research in Physics (Brazil)
  • -
    + \ No newline at end of file diff --git a/assets/js/03a88bad.a73480ea.js b/assets/js/03a88bad.a73480ea.js deleted file mode 100644 index 3f72c42429..0000000000 --- a/assets/js/03a88bad.a73480ea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8078],{49165:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=n(74848),o=n(28453);const r={id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},s=void 0,a={id:"index",title:"Welcome to Rucio's documentation",description:"Rucio is a project that provides services and associated libraries for allowing",source:"@site/../docs/index.md",sourceDirName:".",slug:"/",permalink:"/documentation/",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/index.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},sidebar:"docs",next:{title:"Before you get started",permalink:"/documentation/started/before_you_get_started"}},c={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Client",id:"client",level:2},{value:"Administration",id:"administration",level:2},{value:"Developer Documentation",id:"developer-documentation",level:2},{value:"Contributing to the Documentation",id:"contributing-to-the-documentation",level:2},{value:"About Us",id:"about-us",level:2}];function d(e){const t={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Rucio is a project that provides services and associated libraries for allowing\nscientific collaborations to manage large volumes of data spread across\nfacilities at multiple institutions and organisations. Rucio was originally\ndeveloped to meet the requirements of the high-energy physics experiment\n",(0,i.jsx)(t.a,{href:"https://atlas.cern/",children:"ATLAS"}),", and now is continuously extended to support the\nLHC experiments and other diverse scientific communities."]}),"\n",(0,i.jsx)(t.p,{children:"Rucio offers advanced features, is highly scalable, and modular. It is a data\nmanagement solution that covers the needs of different communities in the\nscientific domain (e.g., HEP, astronomy, biology)."}),"\n",(0,i.jsx)(t.p,{children:"Below are some resources to help you get you started on your journey."}),"\n",(0,i.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsx)(t.p,{children:"What exactly is Rucio? What were the motivations behind developing such a\nsystem? Who uses it? What powers these systems? Answers to all these questions\nand more can be found by browsing through the sub-sections of this topic."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional Layers and Resources"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,i.jsx)(t.p,{children:"The rucio client enables users to interact with the system and access the\ndistributed data. The client can upload, download, manage and delete everything\nfrom single files up to Petabyte sized datasets."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/setting_up_the_rucio_client",children:"Setting Up the Rucio Client"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/using_the_client",children:"Using the Client"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/using_the_admin_client",children:"Using the Admin Client"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"administration",children:"Administration"}),"\n",(0,i.jsx)(t.p,{children:"This section of the documentation deals with some of the material that an\noperator or administrator of a Rucio environment would require. For example, how\nto install a server or some quick tips for working with the administrative\nCLI. Take a deep dive, but not before you ensure you've read through the\npre-requisites section under each of the topics!"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/setting_up_demo",children:"Setting up a Rucio demo environment"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/installing_server",children:"Installing Rucio Server"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/installing_daemons",children:"Installing Rucio Daemons"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/monitoring",children:"Monitoring"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"operator/database",children:"Database"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/configuration_parameters",children:"Configuration parameters"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"developer-documentation",children:"Developer Documentation"}),"\n",(0,i.jsx)(t.p,{children:"Whether you want to develop with Rucio or contribute to the project, the\nDeveloper documentation will help you get started. Peruse some common REST API &\nClient API references that are directly derived from Rucio's python\nlibraries. We also have a contribution guide for those who wish to pitch in."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"client_api/accountclient",children:"Client API Documentation"})}),"\n",(0,i.jsx)(t.li,{children:"REST API Documentation"}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"contributing",children:"Contributing guide"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"contributing-to-the-documentation",children:"Contributing to the Documentation"}),"\n",(0,i.jsxs)(t.p,{children:["Documentation is always a work in progress and we welcome both, qualitative and\ntechnical contributions, from the community. Make sure you look into the\n",(0,i.jsx)(t.a,{href:"https://github.com/rucio/documentation",children:"documentations GitHub repository"})," and\nunderstand the pre-requisites before you submit your first PR!"]}),"\n",(0,i.jsx)(t.h2,{id:"about-us",children:"About Us"}),"\n",(0,i.jsxs)(t.p,{children:["Learn more about the brilliant minds pioneering the development and maintenance\nof Rucio in this section. Should you wish to get in touch with us, we've also\nincluded several ways of doing so in the ",(0,i.jsx)(t.strong,{children:"Contact Us"})," section."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/project_organisation",children:"Project Organisation"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/about_our_contributors",children:"About Our Contributors"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/contact_us",children:"Contact Us"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(96540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03a88bad.d78c9ca1.js b/assets/js/03a88bad.d78c9ca1.js new file mode 100644 index 0000000000..c8a2b26b90 --- /dev/null +++ b/assets/js/03a88bad.d78c9ca1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8078],{49165:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=n(74848),o=n(28453);const r={id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},s=void 0,a={id:"index",title:"Welcome to Rucio's documentation",description:"Rucio is a project that provides services and associated libraries for allowing",source:"@site/../docs/index.md",sourceDirName:".",slug:"/",permalink:"/documentation/",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/index.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"index",title:"Welcome to Rucio's documentation",sidebar_label:"Welcome",slug:"/"},sidebar:"docs",next:{title:"Before you get started",permalink:"/documentation/started/before_you_get_started"}},c={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Client",id:"client",level:2},{value:"Administration",id:"administration",level:2},{value:"Developer Documentation",id:"developer-documentation",level:2},{value:"Contributing to the Documentation",id:"contributing-to-the-documentation",level:2},{value:"About Us",id:"about-us",level:2}];function l(e){const t={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Rucio is a project that provides services and associated libraries for allowing\nscientific collaborations to manage large volumes of data spread across\nfacilities at multiple institutions and organisations. Rucio was originally\ndeveloped to meet the requirements of the high-energy physics experiment\n",(0,i.jsx)(t.a,{href:"https://atlas.cern/",children:"ATLAS"}),", and now is continuously extended to support the\nLHC experiments and other diverse scientific communities."]}),"\n",(0,i.jsx)(t.p,{children:"Rucio offers advanced features, is highly scalable, and modular. It is a data\nmanagement solution that covers the needs of different communities in the\nscientific domain (e.g., HEP, astronomy, biology)."}),"\n",(0,i.jsx)(t.p,{children:"Below are some resources to help you get you started on your journey."}),"\n",(0,i.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsx)(t.p,{children:"What exactly is Rucio? What were the motivations behind developing such a\nsystem? Who uses it? What powers these systems? Answers to all these questions\nand more can be found by browsing through the sub-sections of this topic."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional Layers and Resources"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"client",children:"Client"}),"\n",(0,i.jsx)(t.p,{children:"The rucio client enables users to interact with the system and access the\ndistributed data. The client can upload, download, manage and delete everything\nfrom single files up to Petabyte sized datasets."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/setting_up_the_rucio_client",children:"Setting Up the Rucio Client"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/using_the_client",children:"Using the Client"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/user/using_the_admin_client",children:"Using the Admin Client"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"administration",children:"Administration"}),"\n",(0,i.jsx)(t.p,{children:"This section of the documentation deals with some of the material that an\noperator or administrator of a Rucio environment would require. For example, how\nto install a server or some quick tips for working with the administrative\nCLI. Take a deep dive, but not before you ensure you've read through the\npre-requisites section under each of the topics!"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/setting_up_demo",children:"Setting up a Rucio demo environment"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/installing_server",children:"Installing Rucio Server"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/installing_daemons",children:"Installing Rucio Daemons"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/monitoring",children:"Monitoring"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"operator/database",children:"Database"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/operator/configuration_parameters",children:"Configuration parameters"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"developer-documentation",children:"Developer Documentation"}),"\n",(0,i.jsx)(t.p,{children:"Whether you want to develop with Rucio or contribute to the project, the\nDeveloper documentation will help you get started. Peruse some common REST API &\nClient API references that are directly derived from Rucio's python\nlibraries. We also have a contribution guide for those who wish to pitch in."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"client_api/accountclient",children:"Client API Documentation"})}),"\n",(0,i.jsx)(t.li,{children:"REST API Documentation"}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"contributing",children:"Contributing guide"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"contributing-to-the-documentation",children:"Contributing to the Documentation"}),"\n",(0,i.jsxs)(t.p,{children:["Documentation is always a work in progress and we welcome both, qualitative and\ntechnical contributions, from the community. Make sure you look into the\n",(0,i.jsx)(t.a,{href:"https://github.com/rucio/documentation",children:"documentations GitHub repository"})," and\nunderstand the pre-requisites before you submit your first PR!"]}),"\n",(0,i.jsx)(t.h2,{id:"about-us",children:"About Us"}),"\n",(0,i.jsxs)(t.p,{children:["Learn more about the brilliant minds pioneering the development and maintenance\nof Rucio in this section. Should you wish to get in touch with us, we've also\nincluded several ways of doing so in the ",(0,i.jsx)(t.strong,{children:"Contact Us"})," section."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/project_organisation",children:"Project Organisation"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/about_our_contributors",children:"About Our Contributors"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/documentation/contact_us",children:"Contact Us"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(96540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093ddf2f.a3a257ea.js b/assets/js/093ddf2f.a3a257ea.js new file mode 100644 index 0000000000..970424a368 --- /dev/null +++ b/assets/js/093ddf2f.a3a257ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2985],{70930:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(74848),s=n(28453);const i={id:"special_interest_groups",title:"Special Interest Groups"},o=void 0,c={id:"special_interest_groups",title:"Special Interest Groups",description:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,",source:"@site/../docs/special_interest_groups.md",sourceDirName:".",slug:"/special_interest_groups",permalink:"/documentation/special_interest_groups",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/special_interest_groups.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"special_interest_groups",title:"Special Interest Groups"},sidebar:"docs",previous:{title:"Component leads",permalink:"/documentation/component_leads"},next:{title:"About Our Contributors",permalink:"/documentation/about_our_contributors"}},d={},l=[{value:"Structure",id:"structure",level:2},{value:"Current Special Interest Groups",id:"current-special-interest-groups",level:2},{value:"Past Special Interest Groups",id:"past-special-interest-groups",level:2}];function a(e){const t={a:"a",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,r.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,r.jsx)(t.p,{children:"Each SIG must define"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"A well-defined objective of the group (Creation of a report, Development of\na functionality, ...)"}),"\n",(0,r.jsx)(t.li,{children:"An expected end-date"}),"\n",(0,r.jsx)(t.li,{children:"Means to achieve the objective, such as regular meetings, a mailing-list, mattermost\nchannel, a workshop, ..."}),"\n",(0,r.jsx)(t.li,{children:"A convener"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"current-special-interest-groups",children:"Current Special Interest Groups"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Start"}),(0,r.jsx)(t.th,{children:"est. End"}),(0,r.jsx)(t.th,{children:"Convener"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_metadata",children:"Metadata"})}),(0,r.jsx)(t.td,{children:"Jul-2021"}),(0,r.jsx)(t.td,{children:"Dec-2024"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/robbarnsley",children:"Rob Barnsley"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_tokens",children:"Tokens"})}),(0,r.jsx)(t.td,{children:"Sep-2023"}),(0,r.jsx)(t.td,{children:"Mar-2026"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/dchristidis",children:"Dimitrios Christidis"})})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"past-special-interest-groups",children:"Past Special Interest Groups"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Start"}),(0,r.jsx)(t.th,{children:"End"}),(0,r.jsx)(t.th,{children:"Convener"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_qualityofservice",children:"Quality of Service"})}),(0,r.jsx)(t.td,{children:"Jul-2021"}),(0,r.jsx)(t.td,{children:"Dec-2023"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"mailto:douglas.benjamin@cern.ch",children:"Doug Benjamin"})})]})})]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(96540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093ddf2f.bc8f9a54.js b/assets/js/093ddf2f.bc8f9a54.js deleted file mode 100644 index 0322de9b83..0000000000 --- a/assets/js/093ddf2f.bc8f9a54.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2985],{70930:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=n(74848),s=n(28453);const i={id:"special_interest_groups",title:"Special Interest Groups"},o=void 0,c={id:"special_interest_groups",title:"Special Interest Groups",description:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,",source:"@site/../docs/special_interest_groups.md",sourceDirName:".",slug:"/special_interest_groups",permalink:"/documentation/special_interest_groups",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/special_interest_groups.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"special_interest_groups",title:"Special Interest Groups"},sidebar:"docs",previous:{title:"Component leads",permalink:"/documentation/component_leads"},next:{title:"About Our Contributors",permalink:"/documentation/about_our_contributors"}},l={},d=[{value:"Structure",id:"structure",level:2},{value:"Current Special Interest Groups",id:"current-special-interest-groups",level:2},{value:"Past Special Interest Groups",id:"past-special-interest-groups",level:2}];function a(e){const t={a:"a",h2:"h2",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,r.jsx)(t.h2,{id:"structure",children:"Structure"}),"\n",(0,r.jsx)(t.p,{children:"Each SIG must define"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"A well-defined objective of the group (Creation of a report, Development of\na functionality, ...)"}),"\n",(0,r.jsx)(t.li,{children:"An expected end-date"}),"\n",(0,r.jsx)(t.li,{children:"Means to achieve the objective, such as regular meetings, a mailing-list, mattermost\nchannel, a workshop, ..."}),"\n",(0,r.jsx)(t.li,{children:"A convener"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"current-special-interest-groups",children:"Current Special Interest Groups"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Start"}),(0,r.jsx)(t.th,{children:"est. End"}),(0,r.jsx)(t.th,{children:"Convener"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_metadata",children:"Metadata"})}),(0,r.jsx)(t.td,{children:"Jul-2021"}),(0,r.jsx)(t.td,{children:"Dec-2024"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/robbarnsley",children:"Rob Barnsley"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_tokens",children:"Tokens"})}),(0,r.jsx)(t.td,{children:"Sep-2023"}),(0,r.jsx)(t.td,{children:"Mar-2026"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/dchristidis",children:"Dimitrios Christidis"})})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"past-special-interest-groups",children:"Past Special Interest Groups"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Start"}),(0,r.jsx)(t.th,{children:"End"}),(0,r.jsx)(t.th,{children:"Convener"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/documentation/sig_qualityofservice",children:"Quality of Service"})}),(0,r.jsx)(t.td,{children:"Jul-2021"}),(0,r.jsx)(t.td,{children:"Dec-2023"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"mailto:douglas.benjamin@cern.ch",children:"Doug Benjamin"})})]})})]})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(96540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aef9821.2951d3ed.js b/assets/js/0aef9821.2951d3ed.js new file mode 100644 index 0000000000..c34b40d1de --- /dev/null +++ b/assets/js/0aef9821.2951d3ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[3103],{17654:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var s=n(74848),a=n(28453);const o={title:"Rucio Storage Element"},i=void 0,r={id:"started/concepts/rucio_storage_element",title:"Rucio Storage Element",description:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for",source:"@site/../docs/started/concepts/rucio_storage_element.md",sourceDirName:"started/concepts",slug:"/started/concepts/rucio_storage_element",permalink:"/documentation/started/concepts/rucio_storage_element",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/rucio_storage_element.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{title:"Rucio Storage Element"},sidebar:"docs",previous:{title:"Files, Datasets, and Containers",permalink:"/documentation/started/concepts/file_dataset_container"},next:{title:"Metadata attributes",permalink:"/documentation/started/concepts/metadata_attributes"}},c={},l=[{value:"Rucio Cache RSE",id:"rucio-cache-rse",level:2},{value:"Distances between RSEs",id:"distances-between-rses",level:2}];function d(e){const t={a:"a",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for\nphysical files. It is the smallest unit of storage space addressable within\nRucio. It has a unique identifier and a set of meta attributes describing\nproperties such as supported protocols (https, srm, s3, ...), host/port\naddress, quality of service, storage type (disk, tape, ...), physical space\nproperties (used-, available-, non-pledged space), and geographical zone."}),"\n",(0,s.jsxs)(t.p,{children:["Rucio Storage Elements can be grouped in many logical ways, e.g. the UK RSEs,\nthe Tier-1 RSEs, or the 'good' RSEs. One can reference groups of RSEs by\nmetadata attributes or by explicit enumeration of RSEs. See the section about\n",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expressions"})," for more information."]}),"\n",(0,s.jsx)(t.p,{children:"RSE tags are expanded at transfer time to enumerate target sites. Post-facto\nchanges to the sites in an RSE tag list will not affect currently replicated\nfiles."}),"\n",(0,s.jsx)(t.h2,{id:"rucio-cache-rse",children:"Rucio Cache RSE"}),"\n",(0,s.jsxs)(t.p,{children:["A cache is storage service which keeps additional copies of files to reduce\nresponse time and bandwidth usage. In Rucio, a cache is an RSE, tagged as\nvolatile. The control of the cache content is usually handled by an external\nprocess or applications (e.g. the Workflow management systems) and not by\nRucio. Thus, as Rucio doesn't control all file movements on these RSEs, the\napplication populating the cache must register and unregister these file\nreplicas in Rucio. The information about replica location on volatile RSEs can\nhave a lifetime. Replicas registered on volatile RSEs are excluded from the\nRucio replica management system (replication rules, quota, replication locks)\ndescribed in the section ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"Replica management"}),". Explicit\ntransfer requests can be made to Rucio in order to populate the cache."]}),"\n",(0,s.jsx)(t.h2,{id:"distances-between-rses",children:"Distances between RSEs"}),"\n",(0,s.jsxs)(t.p,{children:["When configuring transfers between RSEs, distances must be defined for that link.\nDistances are unidirectional. To allow transfers in both directions, a distance\nhas to be defined separately in each direction. Refer to the section\n",(0,s.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-overview",children:"Transfers Overview"})," for more details."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var s=n(96540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0aef9821.f9751b6f.js b/assets/js/0aef9821.f9751b6f.js deleted file mode 100644 index 1acbdfcecb..0000000000 --- a/assets/js/0aef9821.f9751b6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[3103],{17654:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var s=n(74848),a=n(28453);const o={title:"Rucio Storage Element"},i=void 0,r={id:"started/concepts/rucio_storage_element",title:"Rucio Storage Element",description:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for",source:"@site/../docs/started/concepts/rucio_storage_element.md",sourceDirName:"started/concepts",slug:"/started/concepts/rucio_storage_element",permalink:"/documentation/started/concepts/rucio_storage_element",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/rucio_storage_element.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{title:"Rucio Storage Element"},sidebar:"docs",previous:{title:"Files, Datasets, and Containers",permalink:"/documentation/started/concepts/file_dataset_container"},next:{title:"Metadata attributes",permalink:"/documentation/started/concepts/metadata_attributes"}},c={},l=[{value:"Rucio Cache RSE",id:"rucio-cache-rse",level:2},{value:"Distances between RSEs",id:"distances-between-rses",level:2}];function d(e){const t={a:"a",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"A Rucio Storage Element (RSE) is the logical abstraction of a storage system for\nphysical files. It is the smallest unit of storage space addressable within\nRucio. It has a unique identifier and a set of meta attributes describing\nproperties such as supported protocols (https, srm, s3, ...), host/port\naddress, quality of service, storage type (disk, tape, ...), physical space\nproperties (used-, available-, non-pledged space), and geographical zone."}),"\n",(0,s.jsxs)(t.p,{children:["Rucio Storage Elements can be grouped in many logical ways, e.g. the UK RSEs,\nthe Tier-1 RSEs, or the 'good' RSEs. One can reference groups of RSEs by\nmetadata attributes or by explicit enumeration of RSEs. See the section about\n",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expressions"})," for more information."]}),"\n",(0,s.jsx)(t.p,{children:"RSE tags are expanded at transfer time to enumerate target sites. Post-facto\nchanges to the sites in an RSE tag list will not affect currently replicated\nfiles."}),"\n",(0,s.jsx)(t.h2,{id:"rucio-cache-rse",children:"Rucio Cache RSE"}),"\n",(0,s.jsxs)(t.p,{children:["A cache is storage service which keeps additional copies of files to reduce\nresponse time and bandwidth usage. In Rucio, a cache is an RSE, tagged as\nvolatile. The control of the cache content is usually handled by an external\nprocess or applications (e.g. the Workflow management systems) and not by\nRucio. Thus, as Rucio doesn't control all file movements on these RSEs, the\napplication populating the cache must register and unregister these file\nreplicas in Rucio. The information about replica location on volatile RSEs can\nhave a lifetime. Replicas registered on volatile RSEs are excluded from the\nRucio replica management system (replication rules, quota, replication locks)\ndescribed in the section ",(0,s.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"Replica management"}),". Explicit\ntransfer requests can be made to Rucio in order to populate the cache."]}),"\n",(0,s.jsx)(t.h2,{id:"distances-between-rses",children:"Distances between RSEs"}),"\n",(0,s.jsxs)(t.p,{children:["When configuring transfers between RSEs, distances must be defined for that link.\nDistances are unidirectional. To allow transfers in both directions, a distance\nhas to be defined separately in each direction. Refer to the section\n",(0,s.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-overview",children:"Transfers Overview"})," for more details."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var s=n(96540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c78ace3.5481e406.js b/assets/js/0c78ace3.5481e406.js deleted file mode 100644 index 9d5bcc5a84..0000000000 --- a/assets/js/0c78ace3.5481e406.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4885],{51783:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(74848),i=o(28453);const s={id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},r=void 0,c={id:"developer/webui/webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code",description:"Different Usecases",source:"@site/../docs/developer/webui/webui_frontend_vscode_dev_env.md",sourceDirName:"developer/webui",slug:"/developer/webui/webui_frontend_vscode_dev_env",permalink:"/documentation/developer/webui/webui_frontend_vscode_dev_env",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend_vscode_dev_env.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},sidebar:"docs",previous:{title:"Style Guide",permalink:"/documentation/developer/dev_style_guide"},next:{title:"Using the WebUI StreamedTable Component",permalink:"/documentation/developer/webui/streamedtables"}},d={},l=[{value:"Different Usecases",id:"different-usecases",level:2},{value:"UI Only",id:"ui-only",level:2},{value:"Connecting to a Rucio instance",id:"connecting-to-a-rucio-instance",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"different-usecases",children:"Different Usecases"}),"\n",(0,t.jsx)(n.p,{children:"There are different usecases when developing for the WebUI, this leads to\nvarying requirements for the development environment. This guide will cover two\nusecases:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"UI development only (i.e. using Storybook)."}),"\n",(0,t.jsx)(n.li,{children:"Full WebUI development, requiring the connection to a Rucio server."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'In both cases, the proposed development environment is run fully local. Visual\nStudio Code is more than just an editor, and we attempt to make use of its "Dev\nContainer"-tooling as much as possible.'}),"\n",(0,t.jsx)(n.h2,{id:"ui-only",children:"UI Only"}),"\n",(0,t.jsxs)(n.p,{children:["Remember that the WebUI frontend is composed of ",(0,t.jsx)(n.em,{children:"Components"}),", which are\ndeveloped with the help of a tool called ",(0,t.jsx)(n.a,{href:"https://storybook.js.org/",children:"Storybook"}),'.\nStorybook is, in its own words, a "frontend workshop for building UI components\nand pages in isolation". To us, it is a viewer which allows us to inspect\nindividual components and interactively manipulate the inputs to these\ncomponents. An example would be viewing a clickable button and manipulating the\n"disabled" attribute, noticing that the colour changes from blue to gray, etc.\nStorybook is also very helpful when testing accessibility and design.']}),"\n",(0,t.jsxs)(n.p,{children:["For a developer whose only intent is to add to or edit these components (found\nunder ",(0,t.jsx)(n.code,{children:"webui/src/component-library"}),"), it is helpful to run a docker container\nwith NPM and TypeScript."]}),"\n",(0,t.jsxs)(n.p,{children:["Open the editor commands with ",(0,t.jsx)(n.code,{children:"Ctrl"}),"-",(0,t.jsx)(n.code,{children:"Shift"}),"-",(0,t.jsx)(n.code,{children:"P"})," and run ",(0,t.jsx)(n.code,{children:"Dev containers: reopen in dev container"}),". Select ",(0,t.jsx)(n.code,{children:"Node.js & Typescript"})," in the follow-up menu. Go with\nthe default values in the following menus."]}),"\n",(0,t.jsxs)(n.p,{children:["You can close the remote connection via the editor commands. From now on, you\ncan reopen the same dev container by opening the folder locally and selecting\n",(0,t.jsx)(n.code,{children:"reopen in dev container"})," from the editor commands. You can also directly open\nthe folder in the dev container, for example using ",(0,t.jsx)(n.code,{children:"File"})," > ",(0,t.jsx)(n.code,{children:"Open Recent"})," and\nthen selecting an element such as ",(0,t.jsx)(n.code,{children:"~/foo/bar [Dev Container]"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"It makes sense to install some extensions for a better dev experience:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Tailwind CSS Intellisense"}),"\n",(0,t.jsx)(n.li,{children:"ESLint"}),"\n",(0,t.jsx)(n.li,{children:"Jest"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"These extensions are specific to the project at hand. Of course, extensions such\nas Github Copilot and GitLens are still helpful."}),"\n",(0,t.jsxs)(n.p,{children:["An further extension that is extremely important is ",(0,t.jsx)(n.em,{children:"Run on Save"})," by\nemeraldwalk. This will need to be configured: enter the settings with ",(0,t.jsx)(n.code,{children:"Ctrl"}),"-",(0,t.jsx)(n.code,{children:","}),"\nand search ",(0,t.jsx)(n.code,{children:"Emeraldwalk: Runonsave"}),". Click on ",(0,t.jsx)(n.code,{children:"Edit in settings.json"}),". Add the\nfollowing configuration:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'"emeraldwalk.runonsave": {\n "commands": [\n {\n "match": "\\\\.tsx$",\n "cmd": "npm run build-tailwind"\n }\n ]\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["to ensure that the ",(0,t.jsx)(n.code,{children:"build-tailwind"})," command will be run each time you save a\n",(0,t.jsx)(n.code,{children:"*.tsx"})," file."]}),"\n",(0,t.jsxs)(n.p,{children:["You can now run Storybook using ",(0,t.jsx)(n.code,{children:"npm run storybook"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"connecting-to-a-rucio-instance",children:"Connecting to a Rucio instance"}),"\n",(0,t.jsx)(n.p,{children:"When testing the full WebUI stack, it will be necessary to connect to a Rucio\nbackend. This can be done by running a Rucio instance locally."}),"\n",(0,t.jsx)(n.p,{children:"We begin by starting all the Docker containers required."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Start the dev container as described above."}),"\n",(0,t.jsxs)(n.li,{children:["Clone Rucio from the ",(0,t.jsx)(n.a,{href:"https://github.com/rucio/rucio",children:"Github Repository"})]}),"\n",(0,t.jsx)(n.li,{children:"Open the folder in VS Code."}),"\n",(0,t.jsxs)(n.li,{children:["Open the editor commands and run ",(0,t.jsx)(n.code,{children:"Docker Compose Up"})," and select\n",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Starting the docker containers using ",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"})," will also\ncreate several RSEs, DIDs, etc. on the rucio instance which are quite helpful\nwhen running tests."]})}),"\n",(0,t.jsx)(n.p,{children:"We must now connect the dev container to the rucio container network."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Figure out the docker name of the dev container. Run ",(0,t.jsx)(n.code,{children:"docker ps"})," and search\nfor name which does not contain the string ",(0,t.jsx)(n.code,{children:"rucio"})]}),"\n",(0,t.jsxs)(n.li,{children:["Connect using ",(0,t.jsx)(n.code,{children:"docker network connect dev_default "}),".\n",(0,t.jsx)(n.code,{children:"dev_default"})," is the name of the network shared by the docker containers spun\nup using ",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"})," from earlier."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, we must change the ",(0,t.jsx)(n.code,{children:"RUCIO_AUTH_HOST"})," and ",(0,t.jsx)(n.code,{children:"RUCIO_HOST"})," in the\n",(0,t.jsx)(n.code,{children:".env.development.local"})," file at the root level of the WebUI repository to point\nto the rucio container. By default, this should be ",(0,t.jsx)(n.code,{children:"https://dev-rucio-1:443"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Test the setup by logging in using the credentials username ",(0,t.jsx)(n.code,{children:"ddmlab"}),"/ password\n",(0,t.jsx)(n.code,{children:"secret"}),"/ account ",(0,t.jsx)(n.code,{children:"root"})," under the VO ",(0,t.jsx)(n.code,{children:"Default"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c78ace3.f308575d.js b/assets/js/0c78ace3.f308575d.js new file mode 100644 index 0000000000..d9030c7822 --- /dev/null +++ b/assets/js/0c78ace3.f308575d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4885],{51783:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(74848),i=o(28453);const s={id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},r=void 0,c={id:"developer/webui/webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code",description:"Different Usecases",source:"@site/../docs/developer/webui/webui_frontend_vscode_dev_env.md",sourceDirName:"developer/webui",slug:"/developer/webui/webui_frontend_vscode_dev_env",permalink:"/documentation/developer/webui/webui_frontend_vscode_dev_env",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend_vscode_dev_env.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"webui_frontend_vscode_dev_env",title:"Setting up a WebUI Developer Environment using Visual Studio Code"},sidebar:"docs",previous:{title:"Style Guide",permalink:"/documentation/developer/dev_style_guide"},next:{title:"Using the WebUI StreamedTable Component",permalink:"/documentation/developer/webui/streamedtables"}},d={},l=[{value:"Different Usecases",id:"different-usecases",level:2},{value:"UI Only",id:"ui-only",level:2},{value:"Connecting to a Rucio instance",id:"connecting-to-a-rucio-instance",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"different-usecases",children:"Different Usecases"}),"\n",(0,t.jsx)(n.p,{children:"There are different usecases when developing for the WebUI, this leads to\nvarying requirements for the development environment. This guide will cover two\nusecases:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"UI development only (i.e. using Storybook)."}),"\n",(0,t.jsx)(n.li,{children:"Full WebUI development, requiring the connection to a Rucio server."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'In both cases, the proposed development environment is run fully local. Visual\nStudio Code is more than just an editor, and we attempt to make use of its "Dev\nContainer"-tooling as much as possible.'}),"\n",(0,t.jsx)(n.h2,{id:"ui-only",children:"UI Only"}),"\n",(0,t.jsxs)(n.p,{children:["Remember that the WebUI frontend is composed of ",(0,t.jsx)(n.em,{children:"Components"}),", which are\ndeveloped with the help of a tool called ",(0,t.jsx)(n.a,{href:"https://storybook.js.org/",children:"Storybook"}),'.\nStorybook is, in its own words, a "frontend workshop for building UI components\nand pages in isolation". To us, it is a viewer which allows us to inspect\nindividual components and interactively manipulate the inputs to these\ncomponents. An example would be viewing a clickable button and manipulating the\n"disabled" attribute, noticing that the colour changes from blue to gray, etc.\nStorybook is also very helpful when testing accessibility and design.']}),"\n",(0,t.jsxs)(n.p,{children:["For a developer whose only intent is to add to or edit these components (found\nunder ",(0,t.jsx)(n.code,{children:"webui/src/component-library"}),"), it is helpful to run a docker container\nwith NPM and TypeScript."]}),"\n",(0,t.jsxs)(n.p,{children:["Open the editor commands with ",(0,t.jsx)(n.code,{children:"Ctrl"}),"-",(0,t.jsx)(n.code,{children:"Shift"}),"-",(0,t.jsx)(n.code,{children:"P"})," and run ",(0,t.jsx)(n.code,{children:"Dev containers: reopen in dev container"}),". Select ",(0,t.jsx)(n.code,{children:"Node.js & Typescript"})," in the follow-up menu. Go with\nthe default values in the following menus."]}),"\n",(0,t.jsxs)(n.p,{children:["You can close the remote connection via the editor commands. From now on, you\ncan reopen the same dev container by opening the folder locally and selecting\n",(0,t.jsx)(n.code,{children:"reopen in dev container"})," from the editor commands. You can also directly open\nthe folder in the dev container, for example using ",(0,t.jsx)(n.code,{children:"File"})," > ",(0,t.jsx)(n.code,{children:"Open Recent"})," and\nthen selecting an element such as ",(0,t.jsx)(n.code,{children:"~/foo/bar [Dev Container]"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"It makes sense to install some extensions for a better dev experience:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Tailwind CSS Intellisense"}),"\n",(0,t.jsx)(n.li,{children:"ESLint"}),"\n",(0,t.jsx)(n.li,{children:"Jest"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"These extensions are specific to the project at hand. Of course, extensions such\nas Github Copilot and GitLens are still helpful."}),"\n",(0,t.jsxs)(n.p,{children:["An further extension that is extremely important is ",(0,t.jsx)(n.em,{children:"Run on Save"})," by\nemeraldwalk. This will need to be configured: enter the settings with ",(0,t.jsx)(n.code,{children:"Ctrl"}),"-",(0,t.jsx)(n.code,{children:","}),"\nand search ",(0,t.jsx)(n.code,{children:"Emeraldwalk: Runonsave"}),". Click on ",(0,t.jsx)(n.code,{children:"Edit in settings.json"}),". Add the\nfollowing configuration:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'"emeraldwalk.runonsave": {\n "commands": [\n {\n "match": "\\\\.tsx$",\n "cmd": "npm run build-tailwind"\n }\n ]\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["to ensure that the ",(0,t.jsx)(n.code,{children:"build-tailwind"})," command will be run each time you save a\n",(0,t.jsx)(n.code,{children:"*.tsx"})," file."]}),"\n",(0,t.jsxs)(n.p,{children:["You can now run Storybook using ",(0,t.jsx)(n.code,{children:"npm run storybook"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"connecting-to-a-rucio-instance",children:"Connecting to a Rucio instance"}),"\n",(0,t.jsx)(n.p,{children:"When testing the full WebUI stack, it will be necessary to connect to a Rucio\nbackend. This can be done by running a Rucio instance locally."}),"\n",(0,t.jsx)(n.p,{children:"We begin by starting all the Docker containers required."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Start the dev container as described above."}),"\n",(0,t.jsxs)(n.li,{children:["Clone Rucio from the ",(0,t.jsx)(n.a,{href:"https://github.com/rucio/rucio",children:"Github Repository"})]}),"\n",(0,t.jsx)(n.li,{children:"Open the folder in VS Code."}),"\n",(0,t.jsxs)(n.li,{children:["Open the editor commands and run ",(0,t.jsx)(n.code,{children:"Docker Compose Up"})," and select\n",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Starting the docker containers using ",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"})," will also\ncreate several RSEs, DIDs, etc. on the rucio instance which are quite helpful\nwhen running tests."]})}),"\n",(0,t.jsx)(n.p,{children:"We must now connect the dev container to the rucio container network."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Figure out the docker name of the dev container. Run ",(0,t.jsx)(n.code,{children:"docker ps"})," and search\nfor name which does not contain the string ",(0,t.jsx)(n.code,{children:"rucio"})]}),"\n",(0,t.jsxs)(n.li,{children:["Connect using ",(0,t.jsx)(n.code,{children:"docker network connect dev_default "}),".\n",(0,t.jsx)(n.code,{children:"dev_default"})," is the name of the network shared by the docker containers spun\nup using ",(0,t.jsx)(n.code,{children:"docker-compose-storage.yml"})," from earlier."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, we must change the ",(0,t.jsx)(n.code,{children:"RUCIO_AUTH_HOST"})," and ",(0,t.jsx)(n.code,{children:"RUCIO_HOST"})," in the\n",(0,t.jsx)(n.code,{children:".env.development.local"})," file at the root level of the WebUI repository to point\nto the rucio container. By default, this should be ",(0,t.jsx)(n.code,{children:"https://dev-rucio-1:443"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Test the setup by logging in using the credentials username ",(0,t.jsx)(n.code,{children:"ddmlab"}),"/ password\n",(0,t.jsx)(n.code,{children:"secret"}),"/ account ",(0,t.jsx)(n.code,{children:"root"})," under the VO ",(0,t.jsx)(n.code,{children:"Default"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1220bf94.1e113c6e.js b/assets/js/1220bf94.1e113c6e.js deleted file mode 100644 index 622c0db0bb..0000000000 --- a/assets/js/1220bf94.1e113c6e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2815],{5237:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var n=i(74848),s=i(28453);const a={id:"replica_workflow",title:"Typical Replica Workflow"},r=void 0,o={id:"started/concepts/replica_workflow",title:"Typical Replica Workflow",description:"This section gives an overview of what happens within Rucio, for a typical",source:"@site/../docs/started/concepts/replica_workflow.md",sourceDirName:"started/concepts",slug:"/started/concepts/replica_workflow",permalink:"/documentation/started/concepts/replica_workflow",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_workflow.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"replica_workflow",title:"Typical Replica Workflow"},sidebar:"docs",previous:{title:"Subscriptions",permalink:"/documentation/started/concepts/subscriptions"},next:{title:"Release Policy",permalink:"/documentation/started/releasepolicy"}},c={},d=[{value:"Replica paths on storage",id:"replica-paths-on-storage",level:2},{value:"Deterministic algorithm based on hashes",id:"deterministic-algorithm-based-on-hashes",level:2},{value:"Deterministic algorithm based on naming convention",id:"deterministic-algorithm-based-on-naming-convention",level:2},{value:"Non-Deterministic algorithm based on parent dataset",id:"non-deterministic-algorithm-based-on-parent-dataset",level:2},{value:"Replica is uploaded with the command line client",id:"replica-is-uploaded-with-the-command-line-client",level:2},{value:"Replica is created by a replication rule",id:"replica-is-created-by-a-replication-rule",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This section gives an overview of what happens within Rucio, for a typical\nreplica workflow. Two workflows are described: When a replica is uploaded to\nRucio via a client and when a replica is created by a site to site transfer due\nto the creation of a ",(0,n.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"replication rule"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"replica-paths-on-storage",children:"Replica paths on storage"}),"\n",(0,n.jsxs)(t.p,{children:["Rucio has two basic paradigms in deciding the path for a replica on a specific\nstorage system. ",(0,n.jsx)(t.strong,{children:"Deterministic"})," and ",(0,n.jsx)(t.strong,{children:"Non-deterministic"})," paths. If we assume\na file whose data identifier is ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"}),", thus the scope is\n",(0,n.jsx)(t.code,{children:"user.jdoe"})," and the name is ",(0,n.jsx)(t.code,{children:"test.file.1"}),". In Rucio a deterministically created\npath is a path which can be generated solely knowing the scope and name of a\ndata identifier (Ignoring the static prefix of the storage endpoint). For a\nnon-deterministic path additional information describing the file is necessary,\nsuch as meta-data, the dataset the file belongs to, etc."]}),"\n",(0,n.jsx)(t.p,{children:"Rucio supports pluggable algorithms for both deterministic and non-deterministic\nalgorithms. This section explains a few of them."}),"\n",(0,n.jsx)(t.h2,{id:"deterministic-algorithm-based-on-hashes",children:"Deterministic algorithm based on hashes"}),"\n",(0,n.jsx)(t.p,{children:"The hash deterministic algorithm is an algorithm commonly used in Rucio. The\nadvantage of this algorithm is that, due to the characteristics of cryptographic\nhash functions, the files are evenly distributed to directories. This can be an\nimportant characteristic for storage systems whose access performance degrades\nbased on the number of files in a directory."}),"\n",(0,n.jsxs)(t.p,{children:["For a data identifier, e.g. ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," a md5-hashsum is calculated\n",(0,n.jsx)(t.code,{children:"077c8119053bebb168d125034bff64ac"}),". The generated path is then based on the\nfirst four characters of the hashsum. e.g. ",(0,n.jsx)(t.code,{children:"/user/jdoe/07/7c/test.file.1"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"deterministic-algorithm-based-on-naming-convention",children:"Deterministic algorithm based on naming convention"}),"\n",(0,n.jsx)(t.p,{children:"If a specific naming convention is enforced on the filenames, a possible\ndeterministic algorithm can be based on it."}),"\n",(0,n.jsxs)(t.p,{children:["For the data identifier ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," the first part of the filename\n(",(0,n.jsx)(t.code,{children:"test"}),") is extracted and used to generate the path: ",(0,n.jsx)(t.code,{children:"/test/user.jdoe/file.1"})]}),"\n",(0,n.jsx)(t.h2,{id:"non-deterministic-algorithm-based-on-parent-dataset",children:"Non-Deterministic algorithm based on parent dataset"}),"\n",(0,n.jsxs)(t.p,{children:["If the file is part of a dataset, e.g. ",(0,n.jsx)(t.code,{children:"data:dataset1234"})," the dataset can be\nused in the path of the filename. This is useful for e.g. tape storage systems,\nto keep the files belonging to the same dataset on the same tape."]}),"\n",(0,n.jsxs)(t.p,{children:["For the data identifier ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," which is part of the dataset\n",(0,n.jsx)(t.code,{children:"data:dataset1234"})," the generated path is:\n",(0,n.jsx)(t.code,{children:"/data/dataset1234/user.jdoe/test.file.1"})]}),"\n",(0,n.jsx)(t.h2,{id:"replica-is-uploaded-with-the-command-line-client",children:"Replica is uploaded with the command line client"}),"\n",(0,n.jsx)(t.p,{children:"This is a typical workflow when a user uploads multiple files, which are part of\na dataset, via the command line client."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The dataset ",(0,n.jsx)(t.code,{children:"test.dataset"})," is being registered at the server. All files, or\ndatasets are associated to a ",(0,n.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"scope"}),", if not\nspecifically mentioned the client will assume the default scope of the user,\nsuch as ",(0,n.jsx)(t.code,{children:"user.jdoe"}),". Thus the full data identifier for the dataset is\n",(0,n.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The client queries the RSE information from the server. This not only gives a\nlist of prioritized write protocols to use but also the information if the\nRSE is a deterministic or non-deterministic one."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The file replica is registered as ",(0,n.jsx)(t.code,{children:"COPYING"})," on the RSE."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Based on the identified naming algorithm of the RSE and the list of\nprioritized write protocols, the file URL is calculated. e.g. using the hash\nalgorithm from above:\n",(0,n.jsx)(t.code,{children:"https://storageserver.organization.org/VO/data/user/jdoe/07/7c/test.file.1"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The file upload is done with the first prioritized protocol. If the upload\nfails, step 4 is repeated with the second prioritized protocol, etc."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Once the upload is successfully finished, the replica state is changed to\n",(0,n.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Step 3-6 are repeated (done in parallel) with all other files part of the\nuploaded dataset."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"replica-is-created-by-a-replication-rule",children:"Replica is created by a replication rule"}),"\n",(0,n.jsx)(t.p,{children:"This is a typical workflow if a file already exists in Rucio but the user wants\nto replicate it to a different RSE."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The user creates a replication rule for the dataset ",(0,n.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"\nat the server."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The Rucio server creates internal requests for each single file in the\ndataset and puts them in a queue to be read by the data transfer service."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The data transfer submitter picks these requests up and queries the\ndestination RSE information for each file."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Based on the identified naming algorithm of the destination RSE it creates\nthe destination URLs and creates the file replicas in ",(0,n.jsx)(t.code,{children:"COPYING"})," state."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The transfer service then submits the transfer job to the connected transfer\ntool (e.g. FTS)"}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Once the transfers are finished the transfer tool notifies Rucio about the\ntransfer success and the transfer services mark the replicas as ",(0,n.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1220bf94.5b253c84.js b/assets/js/1220bf94.5b253c84.js new file mode 100644 index 0000000000..007fd3fa42 --- /dev/null +++ b/assets/js/1220bf94.5b253c84.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2815],{5237:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var n=i(74848),s=i(28453);const a={id:"replica_workflow",title:"Typical Replica Workflow"},r=void 0,o={id:"started/concepts/replica_workflow",title:"Typical Replica Workflow",description:"This section gives an overview of what happens within Rucio, for a typical",source:"@site/../docs/started/concepts/replica_workflow.md",sourceDirName:"started/concepts",slug:"/started/concepts/replica_workflow",permalink:"/documentation/started/concepts/replica_workflow",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_workflow.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"replica_workflow",title:"Typical Replica Workflow"},sidebar:"docs",previous:{title:"Subscriptions",permalink:"/documentation/started/concepts/subscriptions"},next:{title:"Release Policy",permalink:"/documentation/started/releasepolicy"}},c={},d=[{value:"Replica paths on storage",id:"replica-paths-on-storage",level:2},{value:"Deterministic algorithm based on hashes",id:"deterministic-algorithm-based-on-hashes",level:2},{value:"Deterministic algorithm based on naming convention",id:"deterministic-algorithm-based-on-naming-convention",level:2},{value:"Non-Deterministic algorithm based on parent dataset",id:"non-deterministic-algorithm-based-on-parent-dataset",level:2},{value:"Replica is uploaded with the command line client",id:"replica-is-uploaded-with-the-command-line-client",level:2},{value:"Replica is created by a replication rule",id:"replica-is-created-by-a-replication-rule",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["This section gives an overview of what happens within Rucio, for a typical\nreplica workflow. Two workflows are described: When a replica is uploaded to\nRucio via a client and when a replica is created by a site to site transfer due\nto the creation of a ",(0,n.jsx)(t.a,{href:"/documentation/started/concepts/replica_management",children:"replication rule"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"replica-paths-on-storage",children:"Replica paths on storage"}),"\n",(0,n.jsxs)(t.p,{children:["Rucio has two basic paradigms in deciding the path for a replica on a specific\nstorage system. ",(0,n.jsx)(t.strong,{children:"Deterministic"})," and ",(0,n.jsx)(t.strong,{children:"Non-deterministic"})," paths. If we assume\na file whose data identifier is ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"}),", thus the scope is\n",(0,n.jsx)(t.code,{children:"user.jdoe"})," and the name is ",(0,n.jsx)(t.code,{children:"test.file.1"}),". In Rucio a deterministically created\npath is a path which can be generated solely knowing the scope and name of a\ndata identifier (Ignoring the static prefix of the storage endpoint). For a\nnon-deterministic path additional information describing the file is necessary,\nsuch as meta-data, the dataset the file belongs to, etc."]}),"\n",(0,n.jsx)(t.p,{children:"Rucio supports pluggable algorithms for both deterministic and non-deterministic\nalgorithms. This section explains a few of them."}),"\n",(0,n.jsx)(t.h2,{id:"deterministic-algorithm-based-on-hashes",children:"Deterministic algorithm based on hashes"}),"\n",(0,n.jsx)(t.p,{children:"The hash deterministic algorithm is an algorithm commonly used in Rucio. The\nadvantage of this algorithm is that, due to the characteristics of cryptographic\nhash functions, the files are evenly distributed to directories. This can be an\nimportant characteristic for storage systems whose access performance degrades\nbased on the number of files in a directory."}),"\n",(0,n.jsxs)(t.p,{children:["For a data identifier, e.g. ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," a md5-hashsum is calculated\n",(0,n.jsx)(t.code,{children:"077c8119053bebb168d125034bff64ac"}),". The generated path is then based on the\nfirst four characters of the hashsum. e.g. ",(0,n.jsx)(t.code,{children:"/user/jdoe/07/7c/test.file.1"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"deterministic-algorithm-based-on-naming-convention",children:"Deterministic algorithm based on naming convention"}),"\n",(0,n.jsx)(t.p,{children:"If a specific naming convention is enforced on the filenames, a possible\ndeterministic algorithm can be based on it."}),"\n",(0,n.jsxs)(t.p,{children:["For the data identifier ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," the first part of the filename\n(",(0,n.jsx)(t.code,{children:"test"}),") is extracted and used to generate the path: ",(0,n.jsx)(t.code,{children:"/test/user.jdoe/file.1"})]}),"\n",(0,n.jsx)(t.h2,{id:"non-deterministic-algorithm-based-on-parent-dataset",children:"Non-Deterministic algorithm based on parent dataset"}),"\n",(0,n.jsxs)(t.p,{children:["If the file is part of a dataset, e.g. ",(0,n.jsx)(t.code,{children:"data:dataset1234"})," the dataset can be\nused in the path of the filename. This is useful for e.g. tape storage systems,\nto keep the files belonging to the same dataset on the same tape."]}),"\n",(0,n.jsxs)(t.p,{children:["For the data identifier ",(0,n.jsx)(t.code,{children:"user.jdoe:test.file.1"})," which is part of the dataset\n",(0,n.jsx)(t.code,{children:"data:dataset1234"})," the generated path is:\n",(0,n.jsx)(t.code,{children:"/data/dataset1234/user.jdoe/test.file.1"})]}),"\n",(0,n.jsx)(t.h2,{id:"replica-is-uploaded-with-the-command-line-client",children:"Replica is uploaded with the command line client"}),"\n",(0,n.jsx)(t.p,{children:"This is a typical workflow when a user uploads multiple files, which are part of\na dataset, via the command line client."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The dataset ",(0,n.jsx)(t.code,{children:"test.dataset"})," is being registered at the server. All files, or\ndatasets are associated to a ",(0,n.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"scope"}),", if not\nspecifically mentioned the client will assume the default scope of the user,\nsuch as ",(0,n.jsx)(t.code,{children:"user.jdoe"}),". Thus the full data identifier for the dataset is\n",(0,n.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The client queries the RSE information from the server. This not only gives a\nlist of prioritized write protocols to use but also the information if the\nRSE is a deterministic or non-deterministic one."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The file replica is registered as ",(0,n.jsx)(t.code,{children:"COPYING"})," on the RSE."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Based on the identified naming algorithm of the RSE and the list of\nprioritized write protocols, the file URL is calculated. e.g. using the hash\nalgorithm from above:\n",(0,n.jsx)(t.code,{children:"https://storageserver.organization.org/VO/data/user/jdoe/07/7c/test.file.1"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The file upload is done with the first prioritized protocol. If the upload\nfails, step 4 is repeated with the second prioritized protocol, etc."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Once the upload is successfully finished, the replica state is changed to\n",(0,n.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Step 3-6 are repeated (done in parallel) with all other files part of the\nuploaded dataset."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"replica-is-created-by-a-replication-rule",children:"Replica is created by a replication rule"}),"\n",(0,n.jsx)(t.p,{children:"This is a typical workflow if a file already exists in Rucio but the user wants\nto replicate it to a different RSE."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["The user creates a replication rule for the dataset ",(0,n.jsx)(t.code,{children:"user.jdoe:test.dataset"}),"\nat the server."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The Rucio server creates internal requests for each single file in the\ndataset and puts them in a queue to be read by the data transfer service."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The data transfer submitter picks these requests up and queries the\ndestination RSE information for each file."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Based on the identified naming algorithm of the destination RSE it creates\nthe destination URLs and creates the file replicas in ",(0,n.jsx)(t.code,{children:"COPYING"})," state."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"The transfer service then submits the transfer job to the connected transfer\ntool (e.g. FTS)"}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Once the transfers are finished the transfer tool notifies Rucio about the\ntransfer success and the transfer services mark the replicas as ",(0,n.jsx)(t.code,{children:"AVAILABLE"}),"."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>o});var n=i(96540);const s={},a=n.createContext(s);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/138181e0.8820e01e.js b/assets/js/138181e0.8820e01e.js deleted file mode 100644 index ad44afca6a..0000000000 --- a/assets/js/138181e0.8820e01e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5152],{52285:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=n(74848),o=n(28453);const s={id:"notifications",title:"Notifications",sidebar_label:"Notifications"},a=void 0,c={id:"started/concepts/notifications",title:"Notifications",description:"External applications can require synchronisation on events relative to",source:"@site/../docs/started/concepts/notifications.md",sourceDirName:"started/concepts",slug:"/started/concepts/notifications",permalink:"/documentation/started/concepts/notifications",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/notifications.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"notifications",title:"Notifications",sidebar_label:"Notifications"},sidebar:"docs",previous:{title:"Accounting and quota",permalink:"/documentation/started/concepts/accounting_and_quota"},next:{title:"Subscriptions",permalink:"/documentation/started/concepts/subscriptions"}},r={},d=[];function p(t){const e={a:"a",p:"p",...(0,o.R)(),...t.components};return(0,i.jsxs)(e.p,{children:["External applications can require synchronisation on events relative to\ndata availability and can subscribe to particular events, e.g., dataset\nstate changes, replication rule state changes, etc. Rucio publishes\nmessages via the ",(0,i.jsx)(e.a,{href:"https://stomp.github.io",children:"STOMP"})," protocol (to e.g.\n",(0,i.jsx)(e.a,{href:"https://activemq.apache.org",children:"ActiveMQ"}),") when these events happen."]})}function u(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(p,{...t})}):p(t)}},28453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>c});var i=n(96540);const o={},s=i.createContext(o);function a(t){const e=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),i.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/138181e0.e9378330.js b/assets/js/138181e0.e9378330.js new file mode 100644 index 0000000000..c31e44cf47 --- /dev/null +++ b/assets/js/138181e0.e9378330.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5152],{52285:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=n(74848),o=n(28453);const s={id:"notifications",title:"Notifications",sidebar_label:"Notifications"},a=void 0,c={id:"started/concepts/notifications",title:"Notifications",description:"External applications can require synchronisation on events relative to",source:"@site/../docs/started/concepts/notifications.md",sourceDirName:"started/concepts",slug:"/started/concepts/notifications",permalink:"/documentation/started/concepts/notifications",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/notifications.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"notifications",title:"Notifications",sidebar_label:"Notifications"},sidebar:"docs",previous:{title:"Accounting and quota",permalink:"/documentation/started/concepts/accounting_and_quota"},next:{title:"Subscriptions",permalink:"/documentation/started/concepts/subscriptions"}},r={},d=[];function p(t){const e={a:"a",p:"p",...(0,o.R)(),...t.components};return(0,i.jsxs)(e.p,{children:["External applications can require synchronisation on events relative to\ndata availability and can subscribe to particular events, e.g., dataset\nstate changes, replication rule state changes, etc. Rucio publishes\nmessages via the ",(0,i.jsx)(e.a,{href:"https://stomp.github.io",children:"STOMP"})," protocol (to e.g.\n",(0,i.jsx)(e.a,{href:"https://activemq.apache.org",children:"ActiveMQ"}),") when these events happen."]})}function u(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(p,{...t})}):p(t)}},28453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>c});var i=n(96540);const o={},s=i.createContext(o);function a(t){const e=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),i.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1705cd3e.8cd623d7.js b/assets/js/1705cd3e.8cd623d7.js new file mode 100644 index 0000000000..ecdca7a8f5 --- /dev/null +++ b/assets/js/1705cd3e.8cd623d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8015],{72266:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>l,metadata:()=>c,toc:()=>t});var r=n(74848),a=n(28453);const l={id:"about_our_contributors",title:"About Our Contributors"},s="Individual contributors to the source code",c={id:"about_our_contributors",title:"About Our Contributors",description:"Below is a list of contibutors who have contributed to the",source:"@site/../docs/about_our_contributors.md",sourceDirName:".",slug:"/about_our_contributors",permalink:"/documentation/about_our_contributors",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/about_our_contributors.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"about_our_contributors",title:"About Our Contributors"},sidebar:"docs",previous:{title:"Special Interest Groups",permalink:"/documentation/special_interest_groups"},next:{title:"Contact us",permalink:"/documentation/contact_us"}},o={},t=[];function h(i){const e={a:"a",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...i.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.p,{children:"Below is a list of contibutors who have contributed to the\nsource code & their employers."}),"\n",(0,r.jsxs)(e.p,{children:["Should you wish to contribute to the Rucio source code or the documentation,\nplease ensure you go through the guidelines listed in the ",(0,r.jsx)(e.a,{href:"contributing",children:(0,r.jsx)(e.strong,{children:"contribution guide\nfor developers"})})," and look into the ",(0,r.jsx)(e.a,{href:"https://github.com/rucio/documentation",children:"documentation GitHub\nrepository"})," before making a submission."]}),"\n",(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"individual-contributors-to-the-source-code",children:"Individual contributors to the source code"})}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Mario Lassnig ",(0,r.jsx)(e.a,{href:"mailto:mario.lassnig@cern.ch",children:"mario.lassnig@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Vincent Garonne ",(0,r.jsx)(e.a,{href:"mailto:vgaronne@gmail.com",children:"vgaronne@gmail.com"}),", 2012-2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Angelos Molfetas ",(0,r.jsx)(e.a,{href:"mailto:Angelos.Molfetas@cern.ch",children:"Angelos.Molfetas@cern.c"}),", 2012"]}),"\n",(0,r.jsxs)(e.li,{children:["Martin Barisits ",(0,r.jsx)(e.a,{href:"mailto:martin.barisits@cern.ch",children:"martin.barisits@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Thomas Beermann ",(0,r.jsx)(e.a,{href:"mailto:thomas.beermann@cern.ch",children:"thomas.beermann@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Ralph Vigne ",(0,r.jsx)(e.a,{href:"mailto:ralph.vigne@cern.ch",children:"ralph.vigne@cern.ch"}),", 2012-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Graeme Stewart ",(0,r.jsx)(e.a,{href:"mailto:graeme.andrew.stewart@cern.ch",children:"graeme.andrew.stewart@cern.ch"}),", 2012"]}),"\n",(0,r.jsxs)(e.li,{children:["Yun-Pin Sun ",(0,r.jsx)(e.a,{href:"mailto:winter0128@gmail.com",children:"winter0128@gmail.com"}),", 2012-2013"]}),"\n",(0,r.jsxs)(e.li,{children:["Cedric Serfon ",(0,r.jsx)(e.a,{href:"mailto:cedric.serfon@cern.ch",children:"cedric.serfon@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Luis Rodrigues ",(0,r.jsx)(e.a,{href:"mailto:lfrodrigues@gmail.com",children:"lfrodrigues@gmail.com"}),", 2013"]}),"\n",(0,r.jsxs)(e.li,{children:["WeiJen Chang ",(0,r.jsx)(e.a,{href:"mailto:e4523744@gmail.com",children:"e4523744@gmail.com"}),", 2013-2014"]}),"\n",(0,r.jsxs)(e.li,{children:["Gancho Dimitrov ",(0,r.jsx)(e.a,{href:"mailto:gancho.dimitrov@cern.ch",children:"gancho.dimitrov@cern.ch"}),", 2013"]}),"\n",(0,r.jsxs)(e.li,{children:["Wen Guan ",(0,r.jsx)(e.a,{href:"mailto:wguan.icedew@gmail.com",children:"wguan.icedew@gmail.co"}),", 2014-2017"]}),"\n",(0,r.jsxs)(e.li,{children:["David Cameron ",(0,r.jsx)(e.a,{href:"mailto:d.g.cameron@gmail.com",children:"d.g.cameron@gmail.com"}),", 2014-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Tom\xe1\u0161 Kouba ",(0,r.jsx)(e.a,{href:"mailto:tomas.kouba@cern.ch",children:"tomas.kouba@cern.ch"}),", 2014-2015"]}),"\n",(0,r.jsxs)(e.li,{children:["Cheng-Hsi Chao ",(0,r.jsx)(e.a,{href:"mailto:cheng-hsi.chao@cern.ch",children:"cheng-hsi.chao@cern.ch"}),", 2014"]}),"\n",(0,r.jsxs)(e.li,{children:["Evangelia Liotiri ",(0,r.jsx)(e.a,{href:"mailto:evangelia.liotiri@cern.ch",children:"evangelia.liotiri@cern.ch"}),", 2014-2015"]}),"\n",(0,r.jsxs)(e.li,{children:["Joaqu\xedn Bogado ",(0,r.jsx)(e.a,{href:"mailto:jbogado@linti.unlp.edu.ar",children:"jbogado@linti.unlp.edu.ar"}),", 2014-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Fernando L\xf3pez ",(0,r.jsx)(e.a,{href:"mailto:fernando.e.lopez@gmail.com",children:"fernando.e.lopez@gmail.com"}),", 2015-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Sylvain Blunier ",(0,r.jsx)(e.a,{href:"mailto:sylvain.blunier@cern.ch",children:"sylvain.blunier@cern.ch"}),", 2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Tomas Javurek ",(0,r.jsx)(e.a,{href:"mailto:tomas.javurek@cern.ch",children:"tomas.javurek@cern.ch"}),", 2016-2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Brian Bockelman ",(0,r.jsx)(e.a,{href:"mailto:bbockelm@cse.unl.edu",children:"bbockelm@cse.unl.edu"}),", 2016-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Tobias Wegner ",(0,r.jsx)(e.a,{href:"mailto:twegner@cern.ch",children:"twegner@cern.ch"}),", 2017-2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Frank Berghaus ",(0,r.jsx)(e.a,{href:"mailto:frank.berghaus@cern.ch",children:"frank.berghaus@cern.ch)"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Vitjan Zavrtanik ",(0,r.jsx)(e.a,{href:"mailto:vitjan.zavrtanik@cern.ch",children:"vitjan.zavrtanik@cern.ch"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Stefan Prenner ",(0,r.jsx)(e.a,{href:"mailto:stefan.prenner@cern.ch",children:"stefan.prenner@cern.ch"}),", 2017-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Nicolo Magini ",(0,r.jsx)(e.a,{href:"mailto:Nicolo.Magini@cern.ch",children:"Nicolo.Magini@cern.ch"}),", 2017-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Oliver Freyermuth ",(0,r.jsx)(e.a,{href:"mailto:o.freyermuth@googlemail.com",children:"o.freyermuth@googlemail.co"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Eric Vaandering ",(0,r.jsx)(e.a,{href:"mailto:ericvaandering@gmail.com",children:"ericvaandering@gmail.co"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Dimitrios Christidis ",(0,r.jsx)(e.a,{href:"mailto:dimitrios.christidis@cern.ch",children:"dimitrios.christidis@cern.ch"}),", 2018-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Igor Mandrichenko ",(0,r.jsx)(e.a,{href:"mailto:ivm@fnal.gov",children:"ivm@fnal.gov"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Shreyansh Khajanchi ",(0,r.jsx)(e.a,{href:"mailto:shreyansh_k@live.com",children:"shreyansh_k@live.com"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Robert Illingworth ",(0,r.jsx)(e.a,{href:"mailto:illingwo@fnal.gov",children:"illingwo@fnal.gov"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Hannes Hansen ",(0,r.jsx)(e.a,{href:"mailto:hannes.jakob.hansen@cern.ch",children:"hannes.jakob.hansen@cern.c"}),", 2018-2019"]}),"\n",(0,r.jsxs)(e.li,{children:["James Perry ",(0,r.jsx)(e.a,{href:"mailto:j.perry@epcc.ed.ac.uk",children:"j.perry@epcc.ed.ac.uk"}),", 2019-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Vivek Nigam ",(0,r.jsx)(e.a,{href:"mailto:viveknigam.nigam3@gmail.com",children:"viveknigam.nigam3@gmail.com"}),", 2019 - 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Kaustubh Hiware ",(0,r.jsx)(e.a,{href:"mailto:hiwarekaustubh@gmail.com",children:"hiwarekaustubh@gmail.co"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Florido Paganelli ",(0,r.jsx)(e.a,{href:"mailto:florido.paganelli@hep.lu.se",children:"florido.paganelli@hep.lu.se"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Boris Bauermeister ",(0,r.jsx)(e.a,{href:"mailto:Boris.Bauermeister@gmail.com",children:"Boris.Bauermeister@gmail.com"})," 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Ruturaj Gujar ",(0,r.jsx)(e.a,{href:"mailto:ruturaj.gujar23@gmail.com",children:"ruturaj.gujar23@gmail.com"})," 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Andrew Lister ",(0,r.jsx)(e.a,{href:"mailto:andrew.lister@stfc.ac.uk",children:"andrew.lister@stfc.ac.uk"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Aristeidis Fkiaras ",(0,r.jsx)(e.a,{href:"mailto:aristeidis.fkiaras@cern.ch",children:"aristeidis.fkiaras@cern.ch"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Benedikt Ziemons ",(0,r.jsx)(e.a,{href:"mailto:benedikt.ziemons@cern.ch",children:"benedikt.ziemons@cern.ch"}),", 2020-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Muhammad Aditya Hilmy ",(0,r.jsx)(e.a,{href:"mailto:mhilmy@hey.com",children:"mhilmy@hey.com"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Eli Chadwick ",(0,r.jsx)(e.a,{href:"mailto:eli.chadwick@stfc.ac.uk",children:"eli.chadwick@stfc.ac.uk"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Patrick Austin ",(0,r.jsxs)(e.a,{href:"mailto:patrick.austin@stfc.ac.uk",children:[":patrick",".austin@stfc.ac.uk"]}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Rob Barnsley ",(0,r.jsx)(e.a,{href:"mailto:R.Barnsley@skatelescope.org",children:"R.Barnsley@skatelescope.org"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Alan Malta Rodrigues ",(0,r.jsx)(e.a,{href:"mailto:alan.malta@cern.ch",children:"alan.malta@cern.ch"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Rizart Dona ",(0,r.jsx)(e.a,{href:"mailto:rizart.dona@gmail.com",children:"rizart.dona@gmail.com"}),", 2021-2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Aksel Lunde Aase ",(0,r.jsx)(e.a,{href:"mailto:aksel.lunde.aase@gmail.com",children:"aksel.lunde.aase@gmail.co"}),", 2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Anton Schwarz ",(0,r.jsx)(e.a,{href:"mailto:anton.schwarz@cern.ch",children:"anton.schwarz@cern.ch"}),", 2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Johannes Lange ",(0,r.jsx)(e.a,{href:"mailto:johannes.lange@uni-hamburg.de",children:"johannes.lange@uni-hamburg.de"}),", 2022-2023"]}),"\n",(0,r.jsxs)(e.li,{children:["Domenic Gosein ",(0,r.jsx)(e.a,{href:"mailto:domenic.gosein@cern.ch",children:"domenic.gosein@cern.ch"}),", 2023"]}),"\n",(0,r.jsxs)(e.li,{children:["Eraldo Junior ",(0,r.jsx)(e.a,{href:"mailto:esilvaju@cern.ch",children:"esilvaju@cern.ch"}),", 2021-2024"]}),"\n",(0,r.jsxs)(e.li,{children:["Dimitris Xenakis ",(0,r.jsx)(e.a,{href:"mailto:d.xenakis@ieee.org",children:"d.xenakis@ieee.org"}),", 2024"]}),"\n",(0,r.jsxs)(e.li,{children:["Fabio Luchetti ",(0,r.jsx)(e.a,{href:"mailto:fabio.luchetti@cern.ch",children:"fabio.luchetti@cern.ch"}),", 2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Giovanni Guerrieri ",(0,r.jsx)(e.a,{href:"mailto:giovanni.guerrieri@cern.ch",children:"giovanni.guerrieri@cern.ch"}),", 2024"]}),"\n"]}),"\n",(0,r.jsx)(e.h1,{id:"organisations-employing-contributors",children:"Organisations employing contributors"}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"European Organisation for Nuclear Research (Switzerland)"}),"\n",(0,r.jsx)(e.li,{children:"University of Oslo (Norway)"}),"\n",(0,r.jsx)(e.li,{children:"University of Wisconsin Madison (USA)"}),"\n",(0,r.jsx)(e.li,{children:"National University of La Plata (Argentina)"}),"\n",(0,r.jsx)(e.li,{children:"Albert Ludwigs Universit\xe4t Freiburg (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"University of Nebraska Lincoln (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Bergische Universit\xe4t Wuppertal (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"University of Victoria (Canada)"}),"\n",(0,r.jsx)(e.li,{children:"INFN e Universita Genova (Italy)"}),"\n",(0,r.jsx)(e.li,{children:"University of Bonn (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"Fermi National Accelerator Laboratory (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Leopold-Franzens Universit\xe4t Innsbruck (Austria)"}),"\n",(0,r.jsx)(e.li,{children:"Academia Sinica (Taiwan)"}),"\n",(0,r.jsx)(e.li,{children:"University of Edinburgh (UK)"}),"\n",(0,r.jsx)(e.li,{children:"Birla Institute of Technology, Mesra (India)"}),"\n",(0,r.jsx)(e.li,{children:"Indian Institute of Technology, Kharagpur (India)"}),"\n",(0,r.jsx)(e.li,{children:"Stockholm University, Stockholm (Sweden)"}),"\n",(0,r.jsx)(e.li,{children:"Dwarkadas J. Sanghvi College of Engineering (India)"}),"\n",(0,r.jsx)(e.li,{children:"Science and Technology Facilities Council (UK)"}),"\n",(0,r.jsx)(e.li,{children:"Brookhaven National Laboratory (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Institut Teknologi Bandung (Indonesia)"}),"\n",(0,r.jsx)(e.li,{children:"Universit\xe4t Hamburg (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"Brazilian Center for Research in Physics (Brazil)"}),"\n"]})]})}function d(i={}){const{wrapper:e}={...(0,a.R)(),...i.components};return e?(0,r.jsx)(e,{...i,children:(0,r.jsx)(h,{...i})}):h(i)}},28453:(i,e,n)=>{n.d(e,{R:()=>s,x:()=>c});var r=n(96540);const a={},l=r.createContext(a);function s(i){const e=r.useContext(l);return r.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function c(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(a):i.components||a:s(i.components),r.createElement(l.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/1705cd3e.9b249cf3.js b/assets/js/1705cd3e.9b249cf3.js deleted file mode 100644 index ef4a10d93a..0000000000 --- a/assets/js/1705cd3e.9b249cf3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8015],{72266:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>l,metadata:()=>c,toc:()=>t});var r=n(74848),a=n(28453);const l={id:"about_our_contributors",title:"About Our Contributors"},s="Individual contributors to the source code",c={id:"about_our_contributors",title:"About Our Contributors",description:"Below is a list of contibutors who have contributed to the",source:"@site/../docs/about_our_contributors.md",sourceDirName:".",slug:"/about_our_contributors",permalink:"/documentation/about_our_contributors",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/about_our_contributors.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"about_our_contributors",title:"About Our Contributors"},sidebar:"docs",previous:{title:"Special Interest Groups",permalink:"/documentation/special_interest_groups"},next:{title:"Contact us",permalink:"/documentation/contact_us"}},o={},t=[];function h(i){const e={a:"a",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...i.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.p,{children:"Below is a list of contibutors who have contributed to the\nsource code & their employers."}),"\n",(0,r.jsxs)(e.p,{children:["Should you wish to contribute to the Rucio source code or the documentation,\nplease ensure you go through the guidelines listed in the ",(0,r.jsx)(e.a,{href:"contributing",children:(0,r.jsx)(e.strong,{children:"contribution guide\nfor developers"})})," and look into the ",(0,r.jsx)(e.a,{href:"https://github.com/rucio/documentation",children:"documentation GitHub\nrepository"})," before making a submission."]}),"\n",(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"individual-contributors-to-the-source-code",children:"Individual contributors to the source code"})}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Mario Lassnig ",(0,r.jsx)(e.a,{href:"mailto:mario.lassnig@cern.ch",children:"mario.lassnig@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Vincent Garonne ",(0,r.jsx)(e.a,{href:"mailto:vgaronne@gmail.com",children:"vgaronne@gmail.com"}),", 2012-2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Angelos Molfetas ",(0,r.jsx)(e.a,{href:"mailto:Angelos.Molfetas@cern.ch",children:"Angelos.Molfetas@cern.c"}),", 2012"]}),"\n",(0,r.jsxs)(e.li,{children:["Martin Barisits ",(0,r.jsx)(e.a,{href:"mailto:martin.barisits@cern.ch",children:"martin.barisits@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Thomas Beermann ",(0,r.jsx)(e.a,{href:"mailto:thomas.beermann@cern.ch",children:"thomas.beermann@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Ralph Vigne ",(0,r.jsx)(e.a,{href:"mailto:ralph.vigne@cern.ch",children:"ralph.vigne@cern.ch"}),", 2012-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Graeme Stewart ",(0,r.jsx)(e.a,{href:"mailto:graeme.andrew.stewart@cern.ch",children:"graeme.andrew.stewart@cern.ch"}),", 2012"]}),"\n",(0,r.jsxs)(e.li,{children:["Yun-Pin Sun ",(0,r.jsx)(e.a,{href:"mailto:winter0128@gmail.com",children:"winter0128@gmail.com"}),", 2012-2013"]}),"\n",(0,r.jsxs)(e.li,{children:["Cedric Serfon ",(0,r.jsx)(e.a,{href:"mailto:cedric.serfon@cern.ch",children:"cedric.serfon@cern.ch"}),", 2012-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Luis Rodrigues ",(0,r.jsx)(e.a,{href:"mailto:lfrodrigues@gmail.com",children:"lfrodrigues@gmail.com"}),", 2013"]}),"\n",(0,r.jsxs)(e.li,{children:["WeiJen Chang ",(0,r.jsx)(e.a,{href:"mailto:e4523744@gmail.com",children:"e4523744@gmail.com"}),", 2013-2014"]}),"\n",(0,r.jsxs)(e.li,{children:["Gancho Dimitrov ",(0,r.jsx)(e.a,{href:"mailto:gancho.dimitrov@cern.ch",children:"gancho.dimitrov@cern.ch"}),", 2013"]}),"\n",(0,r.jsxs)(e.li,{children:["Wen Guan ",(0,r.jsx)(e.a,{href:"mailto:wguan.icedew@gmail.com",children:"wguan.icedew@gmail.co"}),", 2014-2017"]}),"\n",(0,r.jsxs)(e.li,{children:["David Cameron ",(0,r.jsx)(e.a,{href:"mailto:d.g.cameron@gmail.com",children:"d.g.cameron@gmail.com"}),", 2014-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Tom\xe1\u0161 Kouba ",(0,r.jsx)(e.a,{href:"mailto:tomas.kouba@cern.ch",children:"tomas.kouba@cern.ch"}),", 2014-2015"]}),"\n",(0,r.jsxs)(e.li,{children:["Cheng-Hsi Chao ",(0,r.jsx)(e.a,{href:"mailto:cheng-hsi.chao@cern.ch",children:"cheng-hsi.chao@cern.ch"}),", 2014"]}),"\n",(0,r.jsxs)(e.li,{children:["Evangelia Liotiri ",(0,r.jsx)(e.a,{href:"mailto:evangelia.liotiri@cern.ch",children:"evangelia.liotiri@cern.ch"}),", 2014-2015"]}),"\n",(0,r.jsxs)(e.li,{children:["Joaqu\xedn Bogado ",(0,r.jsx)(e.a,{href:"mailto:jbogado@linti.unlp.edu.ar",children:"jbogado@linti.unlp.edu.ar"}),", 2014-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Fernando L\xf3pez ",(0,r.jsx)(e.a,{href:"mailto:fernando.e.lopez@gmail.com",children:"fernando.e.lopez@gmail.com"}),", 2015-2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Sylvain Blunier ",(0,r.jsx)(e.a,{href:"mailto:sylvain.blunier@cern.ch",children:"sylvain.blunier@cern.ch"}),", 2016"]}),"\n",(0,r.jsxs)(e.li,{children:["Tomas Javurek ",(0,r.jsx)(e.a,{href:"mailto:tomas.javurek@cern.ch",children:"tomas.javurek@cern.ch"}),", 2016-2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Brian Bockelman ",(0,r.jsx)(e.a,{href:"mailto:bbockelm@cse.unl.edu",children:"bbockelm@cse.unl.edu"}),", 2016-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Tobias Wegner ",(0,r.jsx)(e.a,{href:"mailto:twegner@cern.ch",children:"twegner@cern.ch"}),", 2017-2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Frank Berghaus ",(0,r.jsx)(e.a,{href:"mailto:frank.berghaus@cern.ch",children:"frank.berghaus@cern.ch)"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Vitjan Zavrtanik ",(0,r.jsx)(e.a,{href:"mailto:vitjan.zavrtanik@cern.ch",children:"vitjan.zavrtanik@cern.ch"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Stefan Prenner ",(0,r.jsx)(e.a,{href:"mailto:stefan.prenner@cern.ch",children:"stefan.prenner@cern.ch"}),", 2017-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Nicolo Magini ",(0,r.jsx)(e.a,{href:"mailto:Nicolo.Magini@cern.ch",children:"Nicolo.Magini@cern.ch"}),", 2017-2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Oliver Freyermuth ",(0,r.jsx)(e.a,{href:"mailto:o.freyermuth@googlemail.com",children:"o.freyermuth@googlemail.co"}),", 2017"]}),"\n",(0,r.jsxs)(e.li,{children:["Eric Vaandering ",(0,r.jsx)(e.a,{href:"mailto:ericvaandering@gmail.com",children:"ericvaandering@gmail.co"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Dimitrios Christidis ",(0,r.jsx)(e.a,{href:"mailto:dimitrios.christidis@cern.ch",children:"dimitrios.christidis@cern.ch"}),", 2018-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Igor Mandrichenko ",(0,r.jsx)(e.a,{href:"mailto:ivm@fnal.gov",children:"ivm@fnal.gov"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Shreyansh Khajanchi ",(0,r.jsx)(e.a,{href:"mailto:shreyansh_k@live.com",children:"shreyansh_k@live.com"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Robert Illingworth ",(0,r.jsx)(e.a,{href:"mailto:illingwo@fnal.gov",children:"illingwo@fnal.gov"}),", 2018"]}),"\n",(0,r.jsxs)(e.li,{children:["Hannes Hansen ",(0,r.jsx)(e.a,{href:"mailto:hannes.jakob.hansen@cern.ch",children:"hannes.jakob.hansen@cern.c"}),", 2018-2019"]}),"\n",(0,r.jsxs)(e.li,{children:["James Perry ",(0,r.jsx)(e.a,{href:"mailto:j.perry@epcc.ed.ac.uk",children:"j.perry@epcc.ed.ac.uk"}),", 2019-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Vivek Nigam ",(0,r.jsx)(e.a,{href:"mailto:viveknigam.nigam3@gmail.com",children:"viveknigam.nigam3@gmail.com"}),", 2019 - 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Kaustubh Hiware ",(0,r.jsx)(e.a,{href:"mailto:hiwarekaustubh@gmail.com",children:"hiwarekaustubh@gmail.co"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Florido Paganelli ",(0,r.jsx)(e.a,{href:"mailto:florido.paganelli@hep.lu.se",children:"florido.paganelli@hep.lu.se"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Boris Bauermeister ",(0,r.jsx)(e.a,{href:"mailto:Boris.Bauermeister@gmail.com",children:"Boris.Bauermeister@gmail.com"})," 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Ruturaj Gujar ",(0,r.jsx)(e.a,{href:"mailto:ruturaj.gujar23@gmail.com",children:"ruturaj.gujar23@gmail.com"})," 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Andrew Lister ",(0,r.jsx)(e.a,{href:"mailto:andrew.lister@stfc.ac.uk",children:"andrew.lister@stfc.ac.uk"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Aristeidis Fkiaras ",(0,r.jsx)(e.a,{href:"mailto:aristeidis.fkiaras@cern.ch",children:"aristeidis.fkiaras@cern.ch"}),", 2019"]}),"\n",(0,r.jsxs)(e.li,{children:["Benedikt Ziemons ",(0,r.jsx)(e.a,{href:"mailto:benedikt.ziemons@cern.ch",children:"benedikt.ziemons@cern.ch"}),", 2020-2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Muhammad Aditya Hilmy ",(0,r.jsx)(e.a,{href:"mailto:mhilmy@hey.com",children:"mhilmy@hey.com"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Eli Chadwick ",(0,r.jsx)(e.a,{href:"mailto:eli.chadwick@stfc.ac.uk",children:"eli.chadwick@stfc.ac.uk"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Patrick Austin ",(0,r.jsxs)(e.a,{href:"mailto:patrick.austin@stfc.ac.uk",children:[":patrick",".austin@stfc.ac.uk"]}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Rob Barnsley ",(0,r.jsx)(e.a,{href:"mailto:R.Barnsley@skatelescope.org",children:"R.Barnsley@skatelescope.org"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Alan Malta Rodrigues ",(0,r.jsx)(e.a,{href:"mailto:alan.malta@cern.ch",children:"alan.malta@cern.ch"}),", 2020"]}),"\n",(0,r.jsxs)(e.li,{children:["Rizart Dona ",(0,r.jsx)(e.a,{href:"mailto:rizart.dona@gmail.com",children:"rizart.dona@gmail.com"}),", 2021-2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Aksel Lunde Aase ",(0,r.jsx)(e.a,{href:"mailto:aksel.lunde.aase@gmail.com",children:"aksel.lunde.aase@gmail.co"}),", 2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Anton Schwarz ",(0,r.jsx)(e.a,{href:"mailto:anton.schwarz@cern.ch",children:"anton.schwarz@cern.ch"}),", 2022"]}),"\n",(0,r.jsxs)(e.li,{children:["Johannes Lange ",(0,r.jsx)(e.a,{href:"mailto:johannes.lange@uni-hamburg.de",children:"johannes.lange@uni-hamburg.de"}),", 2022-2023"]}),"\n",(0,r.jsxs)(e.li,{children:["Domenic Gosein ",(0,r.jsx)(e.a,{href:"mailto:domenic.gosein@cern.ch",children:"domenic.gosein@cern.ch"}),", 2023"]}),"\n",(0,r.jsxs)(e.li,{children:["Eraldo Junior ",(0,r.jsx)(e.a,{href:"mailto:esilvaju@cern.ch",children:"esilvaju@cern.ch"}),", 2021-2024"]}),"\n",(0,r.jsxs)(e.li,{children:["Dimitris Xenakis ",(0,r.jsx)(e.a,{href:"mailto:d.xenakis@ieee.org",children:"d.xenakis@ieee.org"}),", 2024"]}),"\n",(0,r.jsxs)(e.li,{children:["Fabio Luchetti ",(0,r.jsx)(e.a,{href:"mailto:fabio.luchetti@cern.ch",children:"fabio.luchetti@cern.ch"}),", 2021"]}),"\n",(0,r.jsxs)(e.li,{children:["Giovanni Guerrieri ",(0,r.jsx)(e.a,{href:"mailto:giovanni.guerrieri@cern.ch",children:"giovanni.guerrieri@cern.ch"}),", 2024"]}),"\n"]}),"\n",(0,r.jsx)(e.h1,{id:"organisations-employing-contributors",children:"Organisations employing contributors"}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"European Organisation for Nuclear Research (Switzerland)"}),"\n",(0,r.jsx)(e.li,{children:"University of Oslo (Norway)"}),"\n",(0,r.jsx)(e.li,{children:"University of Wisconsin Madison (USA)"}),"\n",(0,r.jsx)(e.li,{children:"National University of La Plata (Argentina)"}),"\n",(0,r.jsx)(e.li,{children:"Albert Ludwigs Universit\xe4t Freiburg (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"University of Nebraska Lincoln (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Bergische Universit\xe4t Wuppertal (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"University of Victoria (Canada)"}),"\n",(0,r.jsx)(e.li,{children:"INFN e Universita Genova (Italy)"}),"\n",(0,r.jsx)(e.li,{children:"University of Bonn (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"Fermi National Accelerator Laboratory (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Leopold-Franzens Universit\xe4t Innsbruck (Austria)"}),"\n",(0,r.jsx)(e.li,{children:"Academia Sinica (Taiwan)"}),"\n",(0,r.jsx)(e.li,{children:"University of Edinburgh (UK)"}),"\n",(0,r.jsx)(e.li,{children:"Birla Institute of Technology, Mesra (India)"}),"\n",(0,r.jsx)(e.li,{children:"Indian Institute of Technology, Kharagpur (India)"}),"\n",(0,r.jsx)(e.li,{children:"Stockholm University, Stockholm (Sweden)"}),"\n",(0,r.jsx)(e.li,{children:"Dwarkadas J. Sanghvi College of Engineering (India)"}),"\n",(0,r.jsx)(e.li,{children:"Science and Technology Facilities Council (UK)"}),"\n",(0,r.jsx)(e.li,{children:"Brookhaven National Laboratory (USA)"}),"\n",(0,r.jsx)(e.li,{children:"Institut Teknologi Bandung (Indonesia)"}),"\n",(0,r.jsx)(e.li,{children:"Universit\xe4t Hamburg (Germany)"}),"\n",(0,r.jsx)(e.li,{children:"Brazilian Center for Research in Physics (Brazil)"}),"\n"]})]})}function d(i={}){const{wrapper:e}={...(0,a.R)(),...i.components};return e?(0,r.jsx)(e,{...i,children:(0,r.jsx)(h,{...i})}):h(i)}},28453:(i,e,n)=>{n.d(e,{R:()=>s,x:()=>c});var r=n(96540);const a={},l=r.createContext(a);function s(i){const e=r.useContext(l);return r.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function c(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(a):i.components||a:s(i.components),r.createElement(l.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/assets/js/171dad78.394b033b.js b/assets/js/171dad78.394b033b.js deleted file mode 100644 index 0f6de13f11..0000000000 --- a/assets/js/171dad78.394b033b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5874],{1549:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var n=o(74848),s=o(28453);const r={id:"before_you_get_started",title:"Before you get started"},a=void 0,i={id:"started/before_you_get_started",title:"Before you get started",description:"A great starting point for those absolutely new to Rucio, this section aims to",source:"@site/../docs/started/before_you_get_started.md",sourceDirName:"started",slug:"/started/before_you_get_started",permalink:"/documentation/started/before_you_get_started",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/before_you_get_started.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"before_you_get_started",title:"Before you get started"},sidebar:"docs",previous:{title:"Welcome",permalink:"/documentation/"},next:{title:"What is Rucio?",permalink:"/documentation/started/what_is_rucio"}},d={},c=[];function u(t){const e={a:"a",li:"li",p:"p",ul:"ul",...(0,s.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"A great starting point for those absolutely new to Rucio, this section aims to\nhelps you understand the basics of our Data Management system. The motivations\nbehind this project, what we are looking to achieve, & what we have done so far\nare some of the points covered in this section."}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio?"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional layers and Resources"})}),"\n"]})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>i});var n=o(96540);const s={},r=n.createContext(s);function a(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/171dad78.daca219e.js b/assets/js/171dad78.daca219e.js new file mode 100644 index 0000000000..cf68973c22 --- /dev/null +++ b/assets/js/171dad78.daca219e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5874],{1549:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var n=o(74848),s=o(28453);const r={id:"before_you_get_started",title:"Before you get started"},a=void 0,i={id:"started/before_you_get_started",title:"Before you get started",description:"A great starting point for those absolutely new to Rucio, this section aims to",source:"@site/../docs/started/before_you_get_started.md",sourceDirName:"started",slug:"/started/before_you_get_started",permalink:"/documentation/started/before_you_get_started",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/before_you_get_started.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"before_you_get_started",title:"Before you get started"},sidebar:"docs",previous:{title:"Welcome",permalink:"/documentation/"},next:{title:"What is Rucio?",permalink:"/documentation/started/what_is_rucio"}},d={},c=[];function u(t){const e={a:"a",li:"li",p:"p",ul:"ul",...(0,s.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"A great starting point for those absolutely new to Rucio, this section aims to\nhelps you understand the basics of our Data Management system. The motivations\nbehind this project, what we are looking to achieve, & what we have done so far\nare some of the points covered in this section."}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/what_is_rucio",children:"What is Rucio?"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/main_components",children:"Main Components"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"/documentation/started/additional_layers_and_resources",children:"Additional layers and Resources"})}),"\n"]})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u(t)}},28453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>i});var n=o(96540);const s={},r=n.createContext(s);function a(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a726a41.1cce0ed4.js b/assets/js/1a726a41.1cce0ed4.js deleted file mode 100644 index c08c7656b3..0000000000 --- a/assets/js/1a726a41.1cce0ed4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[9252],{2581:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var s=t(74848),o=t(28453);const i={id:"main_components",title:"Main Components"},a=void 0,r={id:"started/main_components",title:"Main Components",description:"Rucio is based on a distributed system architecture & can be sectioned into four",source:"@site/../docs/started/main_components.md",sourceDirName:"started",slug:"/started/main_components",permalink:"/documentation/started/main_components",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/main_components.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"main_components",title:"Main Components"},sidebar:"docs",previous:{title:"What is Rucio?",permalink:"/documentation/started/what_is_rucio"},next:{title:"Additional Layers and Resources",permalink:"/documentation/started/additional_layers_and_resources"}},c={},d=[{value:"Clients",id:"clients",level:2},{value:"Server",id:"server",level:2},{value:"Core",id:"core",level:2},{value:"Daemons",id:"daemons",level:2}];function l(e){const n={a:"a",h2:"h2",img:"img",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Rucio is based on a distributed system architecture & can be sectioned into four\nmajor layers:"}),"\n",(0,s.jsx)(n.h2,{id:"clients",children:"Clients"}),"\n",(0,s.jsx)(n.p,{children:"The clients layer consists of components such as the command line clients (CLI),\nPython clients, and the Javascript-based web user interface and configuration."}),"\n",(0,s.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,s.jsx)(n.p,{children:"The server layer serves the purpose of authentication & provides a common API\nfor interaction with clients & other external application, as also the Web UI."}),"\n",(0,s.jsx)(n.h2,{id:"core",children:"Core"}),"\n",(0,s.jsx)(n.p,{children:"This layer consists of all the Rucio-level abstractions that are explained at\nlength in the Concepts section."}),"\n",(0,s.jsx)(n.h2,{id:"daemons",children:"Daemons"}),"\n",(0,s.jsx)(n.p,{children:"The daemons layer takes care of all the asynchronous & continuous workflows in\nthe background."}),"\n",(0,s.jsx)(n.p,{children:"A diagrammatic representation of the 4 layers is as shown below"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"image",src:t(81966).A+"",width:"513",height:"452"})}),"\n",(0,s.jsxs)(n.p,{children:["To learn more about each of these layers in detail, download our ",(0,s.jsx)(n.a,{href:"https://link.springer.com/article/10.1007/s41781-019-0026-3",children:"peer reviewed\nscientific paper"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},81966:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/architecture-a407801cb690fc1a73a930e2691f761f.png"},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var s=t(96540);const o={},i=s.createContext(o);function a(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a726a41.80de0d3d.js b/assets/js/1a726a41.80de0d3d.js new file mode 100644 index 0000000000..69f8214b07 --- /dev/null +++ b/assets/js/1a726a41.80de0d3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[9252],{2581:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var s=t(74848),i=t(28453);const o={id:"main_components",title:"Main Components"},a=void 0,r={id:"started/main_components",title:"Main Components",description:"Rucio is based on a distributed system architecture & can be sectioned into four",source:"@site/../docs/started/main_components.md",sourceDirName:"started",slug:"/started/main_components",permalink:"/documentation/started/main_components",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/main_components.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"main_components",title:"Main Components"},sidebar:"docs",previous:{title:"What is Rucio?",permalink:"/documentation/started/what_is_rucio"},next:{title:"Additional Layers and Resources",permalink:"/documentation/started/additional_layers_and_resources"}},c={},d=[{value:"Clients",id:"clients",level:2},{value:"Server",id:"server",level:2},{value:"Core",id:"core",level:2},{value:"Daemons",id:"daemons",level:2}];function l(e){const n={a:"a",h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Rucio is based on a distributed system architecture & can be sectioned into four\nmajor layers:"}),"\n",(0,s.jsx)(n.h2,{id:"clients",children:"Clients"}),"\n",(0,s.jsx)(n.p,{children:"The clients layer consists of components such as the command line clients (CLI),\nPython clients, and the Javascript-based web user interface and configuration."}),"\n",(0,s.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,s.jsx)(n.p,{children:"The server layer serves the purpose of authentication & provides a common API\nfor interaction with clients & other external application, as also the Web UI."}),"\n",(0,s.jsx)(n.h2,{id:"core",children:"Core"}),"\n",(0,s.jsx)(n.p,{children:"This layer consists of all the Rucio-level abstractions that are explained at\nlength in the Concepts section."}),"\n",(0,s.jsx)(n.h2,{id:"daemons",children:"Daemons"}),"\n",(0,s.jsx)(n.p,{children:"The daemons layer takes care of all the asynchronous & continuous workflows in\nthe background."}),"\n",(0,s.jsx)(n.p,{children:"A diagrammatic representation of the 4 layers is as shown below"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"image",src:t(81966).A+"",width:"513",height:"452"})}),"\n",(0,s.jsxs)(n.p,{children:["To learn more about each of these layers in detail, download our ",(0,s.jsx)(n.a,{href:"https://link.springer.com/article/10.1007/s41781-019-0026-3",children:"peer reviewed\nscientific paper"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},81966:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/architecture-a407801cb690fc1a73a930e2691f761f.png"},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var s=t(96540);const i={},o=s.createContext(i);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ae78d49.226cefb2.js b/assets/js/1ae78d49.226cefb2.js deleted file mode 100644 index 97f87b0fe2..0000000000 --- a/assets/js/1ae78d49.226cefb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6552],{89728:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var i=n(74848),o=n(28453);const s={id:"contact_us",title:"Contact us"},c=void 0,a={id:"contact_us",title:"Contact us",description:"We know getting started can be difficult, which is why",source:"@site/../docs/contact_us.md",sourceDirName:".",slug:"/contact_us",permalink:"/documentation/contact_us",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/contact_us.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"contact_us",title:"Contact us"},sidebar:"docs",previous:{title:"About Our Contributors",permalink:"/documentation/about_our_contributors"}},r={},u=[{value:"Chat with us",id:"chat-with-us",level:2},{value:"Weekly Rucio meeting",id:"weekly-rucio-meeting",level:2},{value:"Rucio news mailing list",id:"rucio-news-mailing-list",level:2},{value:"Email us",id:"email-us",level:2},{value:"Social Media",id:"social-media",level:2}];function l(e){const t={a:"a",h2:"h2",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"We know getting started can be difficult, which is why\nour developers are always happy to help out! Reach out\nto us on any of the below channels for any assistance\nwith Rucio."}),"\n",(0,i.jsx)(t.h2,{id:"chat-with-us",children:"Chat with us"}),"\n",(0,i.jsxs)(t.p,{children:["We have a dedicated Mattermost team for questions, support, news, development\nupdates and all things Rucio and you can be a part of it too!\nClick ",(0,i.jsx)(t.a,{href:"/documentation/join_rucio_mattermost",children:"here"})]}),"\n",(0,i.jsx)(t.h2,{id:"weekly-rucio-meeting",children:"Weekly Rucio meeting"}),"\n",(0,i.jsxs)(t.p,{children:["The Rucio community gathers for a meeting every Thursday at 3 PM CEST to discuss\ncommunity news, operational issues and questions, as well as ongoing & further\ncontributions by the development team. The meeting is open to the public\nand you can view the schedule ",(0,i.jsx)(t.a,{href:"https://indico.cern.ch/category/10588/",children:"here"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"rucio-news-mailing-list",children:"Rucio news mailing list"}),"\n",(0,i.jsxs)(t.p,{children:["We have a dedicated news mailing list for general announcements (<10 eMails per\nyear) for the Rucio community. You can subscribe to ",(0,i.jsx)(t.a,{href:"https://e-groups.cern.ch/e-groups/Egroup.do?egroupId=10586148",children:"rucio-news@cern.ch"}),"\ndirectly with a CERN account, for external subscribers please send an eMail\nto ",(0,i.jsx)(t.a,{href:"mailto:rucio-news-subscribe@cern.ch?subject=Subscribe",children:"rucio-news-subscribe@cern.ch"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"email-us",children:"Email us"}),"\n",(0,i.jsxs)(t.p,{children:["We'd love to hear from you! Get in contact with us\ndirectly via ",(0,i.jsx)(t.a,{href:"mailto:rucio-contact@cern.ch",children:"email"})]}),"\n",(0,i.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,i.jsxs)(t.p,{children:["Follow us on ",(0,i.jsx)(t.a,{href:"https://fosstodon.org/@rucio",children:"Mastodon"})," to stay updated\nwith the latest on Rucio!"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function c(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ae78d49.ddd1062e.js b/assets/js/1ae78d49.ddd1062e.js new file mode 100644 index 0000000000..13de168f30 --- /dev/null +++ b/assets/js/1ae78d49.ddd1062e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6552],{89728:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var i=n(74848),o=n(28453);const s={id:"contact_us",title:"Contact us"},c=void 0,a={id:"contact_us",title:"Contact us",description:"We know getting started can be difficult, which is why",source:"@site/../docs/contact_us.md",sourceDirName:".",slug:"/contact_us",permalink:"/documentation/contact_us",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/contact_us.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"contact_us",title:"Contact us"},sidebar:"docs",previous:{title:"About Our Contributors",permalink:"/documentation/about_our_contributors"}},r={},u=[{value:"Chat with us",id:"chat-with-us",level:2},{value:"Weekly Rucio meeting",id:"weekly-rucio-meeting",level:2},{value:"Rucio news mailing list",id:"rucio-news-mailing-list",level:2},{value:"Email us",id:"email-us",level:2},{value:"Social Media",id:"social-media",level:2}];function l(e){const t={a:"a",h2:"h2",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"We know getting started can be difficult, which is why\nour developers are always happy to help out! Reach out\nto us on any of the below channels for any assistance\nwith Rucio."}),"\n",(0,i.jsx)(t.h2,{id:"chat-with-us",children:"Chat with us"}),"\n",(0,i.jsxs)(t.p,{children:["We have a dedicated Mattermost team for questions, support, news, development\nupdates and all things Rucio and you can be a part of it too!\nClick ",(0,i.jsx)(t.a,{href:"/documentation/join_rucio_mattermost",children:"here"})]}),"\n",(0,i.jsx)(t.h2,{id:"weekly-rucio-meeting",children:"Weekly Rucio meeting"}),"\n",(0,i.jsxs)(t.p,{children:["The Rucio community gathers for a meeting every Thursday at 3 PM CEST to discuss\ncommunity news, operational issues and questions, as well as ongoing & further\ncontributions by the development team. The meeting is open to the public\nand you can view the schedule ",(0,i.jsx)(t.a,{href:"https://indico.cern.ch/category/10588/",children:"here"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"rucio-news-mailing-list",children:"Rucio news mailing list"}),"\n",(0,i.jsxs)(t.p,{children:["We have a dedicated news mailing list for general announcements (<10 eMails per\nyear) for the Rucio community. You can subscribe to ",(0,i.jsx)(t.a,{href:"https://e-groups.cern.ch/e-groups/Egroup.do?egroupId=10586148",children:"rucio-news@cern.ch"}),"\ndirectly with a CERN account, for external subscribers please send an eMail\nto ",(0,i.jsx)(t.a,{href:"mailto:rucio-news-subscribe@cern.ch?subject=Subscribe",children:"rucio-news-subscribe@cern.ch"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"email-us",children:"Email us"}),"\n",(0,i.jsxs)(t.p,{children:["We'd love to hear from you! Get in contact with us\ndirectly via ",(0,i.jsx)(t.a,{href:"mailto:rucio-contact@cern.ch",children:"email"})]}),"\n",(0,i.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,i.jsxs)(t.p,{children:["Follow us on ",(0,i.jsx)(t.a,{href:"https://fosstodon.org/@rucio",children:"Mastodon"})," to stay updated\nwith the latest on Rucio!"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>a});var i=n(96540);const o={},s=i.createContext(o);function c(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b18b8b2.9f778a8f.js b/assets/js/1b18b8b2.9f778a8f.js deleted file mode 100644 index a582e74102..0000000000 --- a/assets/js/1b18b8b2.9f778a8f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8939],{33467:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>a});var r=n(74848),s=n(28453);const i={id:"requirements",title:"Requirements",sidebar_label:"Requirements"},d=void 0,o={id:"started/requirements",title:"Requirements",description:"Rucio relies on several dependencies, some of them being a hard requirement,",source:"@site/../docs/started/requirements.md",sourceDirName:"started",slug:"/started/requirements",permalink:"/documentation/started/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/requirements.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"requirements",title:"Requirements",sidebar_label:"Requirements"},sidebar:"docs",previous:{title:"Additional Layers and Resources",permalink:"/documentation/started/additional_layers_and_resources"},next:{title:"Rucio account",permalink:"/documentation/started/concepts/rucio_account"}},c={},a=[{value:"Python",id:"python",level:2},{value:"Database",id:"database",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Rucio relies on several dependencies, some of them being a hard requirement,\nothers being optional depending on the used Rucio functionality."}),"\n",(0,r.jsxs)(t.p,{children:["To install Rucio, we generally recommend a Kubernetes-based deployment based on\nour ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"helm-charts"}),". A direct deployment\nusing Rucio ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/u/rucio",children:"docker containers"}),", or Rucio\n",(0,r.jsx)(t.a,{href:"https://pypi.org/project/rucio/",children:"pip"})," packages is also possible."]}),"\n",(0,r.jsx)(t.h2,{id:"python",children:"Python"}),"\n",(0,r.jsx)(t.p,{children:"Rucio server, daemons and clients are written in Python and thus depend on an\ninstalled Python interpreter."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Rucio release"}),(0,r.jsx)(t.th,{children:"Supported python versions"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/release-notes/1.29.0",children:"1.29 LTS"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:">=3.6, <=3.9"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["from ",(0,r.jsx)(t.a,{href:"/release-notes/32.0.0",children:"32 LTS"})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:">=3.9, <=3.10"})})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Database"}),(0,r.jsx)(t.th,{children:"Supported version"}),(0,r.jsx)(t.th,{children:"Note"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SQLite"}),(0,r.jsx)(t.td,{children:"3+"}),(0,r.jsx)(t.td,{children:"For testing only"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"MySQL"}),(0,r.jsx)(t.td,{children:"8"}),(0,r.jsx)(t.td,{children:"No support for SSH public key authentication"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"PostgreSQL"}),(0,r.jsx)(t.td,{children:"12 and higher"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Oracle"}),(0,r.jsx)(t.td,{children:"19c"}),(0,r.jsx)(t.td,{})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>o});var r=n(96540);const s={},i=r.createContext(s);function d(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b18b8b2.e92e6dc6.js b/assets/js/1b18b8b2.e92e6dc6.js new file mode 100644 index 0000000000..cac4629762 --- /dev/null +++ b/assets/js/1b18b8b2.e92e6dc6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8939],{33467:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>a});var r=n(74848),s=n(28453);const i={id:"requirements",title:"Requirements",sidebar_label:"Requirements"},d=void 0,o={id:"started/requirements",title:"Requirements",description:"Rucio relies on several dependencies, some of them being a hard requirement,",source:"@site/../docs/started/requirements.md",sourceDirName:"started",slug:"/started/requirements",permalink:"/documentation/started/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/requirements.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"requirements",title:"Requirements",sidebar_label:"Requirements"},sidebar:"docs",previous:{title:"Additional Layers and Resources",permalink:"/documentation/started/additional_layers_and_resources"},next:{title:"Rucio account",permalink:"/documentation/started/concepts/rucio_account"}},c={},a=[{value:"Python",id:"python",level:2},{value:"Database",id:"database",level:2}];function l(e){const t={a:"a",code:"code",h2:"h2",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Rucio relies on several dependencies, some of them being a hard requirement,\nothers being optional depending on the used Rucio functionality."}),"\n",(0,r.jsxs)(t.p,{children:["To install Rucio, we generally recommend a Kubernetes-based deployment based on\nour ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"helm-charts"}),". A direct deployment\nusing Rucio ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/u/rucio",children:"docker containers"}),", or Rucio\n",(0,r.jsx)(t.a,{href:"https://pypi.org/project/rucio/",children:"pip"})," packages is also possible."]}),"\n",(0,r.jsx)(t.h2,{id:"python",children:"Python"}),"\n",(0,r.jsx)(t.p,{children:"Rucio server, daemons and clients are written in Python and thus depend on an\ninstalled Python interpreter."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Rucio release"}),(0,r.jsx)(t.th,{children:"Supported python versions"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/release-notes/1.29.0",children:"1.29 LTS"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:">=3.6, <=3.9"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["from ",(0,r.jsx)(t.a,{href:"/release-notes/32.0.0",children:"32 LTS"})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:">=3.9, <=3.10"})})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"database",children:"Database"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Database"}),(0,r.jsx)(t.th,{children:"Supported version"}),(0,r.jsx)(t.th,{children:"Note"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SQLite"}),(0,r.jsx)(t.td,{children:"3+"}),(0,r.jsx)(t.td,{children:"For testing only"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"MySQL"}),(0,r.jsx)(t.td,{children:"8"}),(0,r.jsx)(t.td,{children:"No support for SSH public key authentication"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"PostgreSQL"}),(0,r.jsx)(t.td,{children:"12 and higher"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Oracle"}),(0,r.jsx)(t.td,{children:"19c"}),(0,r.jsx)(t.td,{})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>o});var r=n(96540);const s={},i=r.createContext(s);function d(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1baa3d0c.1f58d08b.js b/assets/js/1baa3d0c.1f58d08b.js deleted file mode 100644 index dbf551b733..0000000000 --- a/assets/js/1baa3d0c.1f58d08b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4390],{1638:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>h});var r=n(74848),o=n(28453);const i={id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},a=void 0,c={id:"operator/administration",title:"Rucio Administration Tricks",description:"Rucio container code hot-patching",source:"@site/../docs/operator/administration.md",sourceDirName:"operator",slug:"/operator/administration",permalink:"/documentation/operator/administration",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/administration.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},sidebar:"docs",previous:{title:"Database Operations",permalink:"/documentation/operator/database"},next:{title:"Configuration parameters",permalink:"/documentation/operator/configuration_parameters"}},s={},h=[{value:"Rucio container code hot-patching",id:"rucio-container-code-hot-patching",level:2},{value:"Creating a patch from existing pull request",id:"creating-a-patch-from-existing-pull-request",level:3},{value:"Mounting a patch in a kubernetes cluster",id:"mounting-a-patch-in-a-kubernetes-cluster",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"rucio-container-code-hot-patching",children:"Rucio container code hot-patching"}),"\n",(0,r.jsx)(t.p,{children:"The rucio official containers provide a way to hotpatch the source code\nbefore running rucio. This behavior may be used to rapidly fix a production\ndeployment without having to wait for the change to be merged and released by\nthe rucio team."}),"\n",(0,r.jsxs)(t.p,{children:["The behavior is very simple: any file found in the ",(0,r.jsx)(t.code,{children:"/patch/*"})," directory inside\nthe containers will be fed to the ",(0,r.jsx)(t.code,{children:"patch"})," command-line tool in the order\nreturned by this glob matching."]}),"\n",(0,r.jsx)(t.p,{children:"The procedures described bellow are only intended for temporary fixes. If a\npermanent change is needed, we highly encourage you to open a pull request\nin rucio to spare you the toil related to maintaining your own local patch set."}),"\n",(0,r.jsx)(t.h3,{id:"creating-a-patch-from-existing-pull-request",children:"Creating a patch from existing pull request"}),"\n",(0,r.jsxs)(t.p,{children:["Lets assume you run rucio ",(0,r.jsx)(t.code,{children:"1.27.3"})," in production, and you realize there is\na bug in the ",(0,r.jsx)(t.code,{children:"conveyor-poller"})," daemon. You contact the rucio team and are\ntold that a fix was already done in the pull request\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/rucio/pull/5246/commits",children:"#5246"}),"\nand will be released next week. Follow\nthe following steps to create a patch file from this pull request without\nhaving to wait for the next rucio release to fix your issue:"]}),"\n",(0,r.jsx)(t.p,{children:"Clone the main rucio repository:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/rucio/rucio.git\ncd rucio\n# Create a new branch from the 1.27.3 release tag\ngit checkout 1.27.3 -b patch-0-hotfix_conveyor_poller_on_1.27.3\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The #5246 pull request was submitted by the user ",(0,r.jsx)(t.code,{children:"rcarpa"})," from his rucio\nfork ",(0,r.jsx)(t.a,{href:"https://github.com/rcarpa/rucio",children:"rcarpa/rucio"}),". You'll have to add\nthis fork repository as a git remote:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git remote add rcarpa https://github.com/rcarpa/rucio.git\ngit fetch rcarpa\n# Cherry-pick the commit from the #5246 pull request.\n# Beware, some PR can have multiple commits\ngit cherry-pick 47d36345469ac9c1391cacd09487d4ec6ced627f\n"})}),"\n",(0,r.jsx)(t.p,{children:"Now you can create the patch with the differences between the rucio 1.27.3\nrelease and the current state of the repository:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"git diff 1.27.3 > hotfix_conveyor_poller.patch\n"})}),"\n",(0,r.jsx)(t.h3,{id:"mounting-a-patch-in-a-kubernetes-cluster",children:"Mounting a patch in a kubernetes cluster"}),"\n",(0,r.jsxs)(t.p,{children:["If you deploy rucio in a kubernetes cluster using the official rucio\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts/",children:"helm charts"})," and want to hotfix\nrucio using a patch file created in the previous section, follow these steps:"]}),"\n",(0,r.jsx)(t.p,{children:"Create a kubernetes secret from the hotfix patch:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"kubectl -n rucio create secret generic hotfix-conveyor-poller-patch --from-file=hotfix_conveyor_poller.patch\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.em,{children:"Note:"})," if you have more than one cluster, don't forget to create the\nsecrets in each cluster to be patched."]}),"\n",(0,r.jsxs)(t.p,{children:["Now you'll have to update the helm ",(0,r.jsx)(t.code,{children:"values"})," file for each helm release and\nadd the following"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:" secretMounts:\n - secretFullName: hotfix-conveyor-poller-patch\n mountPath: /patch/hotfix_conveyor_poller.patch\n subPath: hotfix_conveyor_poller.patch\n"})})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(96540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1baa3d0c.70db0031.js b/assets/js/1baa3d0c.70db0031.js new file mode 100644 index 0000000000..f04f55aee5 --- /dev/null +++ b/assets/js/1baa3d0c.70db0031.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4390],{1638:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>h});var o=n(74848),r=n(28453);const i={id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},a=void 0,c={id:"operator/administration",title:"Rucio Administration Tricks",description:"Rucio container code hot-patching",source:"@site/../docs/operator/administration.md",sourceDirName:"operator",slug:"/operator/administration",permalink:"/documentation/operator/administration",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/administration.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"administration",title:"Rucio Administration Tricks",sidebar_label:"Administration Tricks"},sidebar:"docs",previous:{title:"Database Operations",permalink:"/documentation/operator/database"},next:{title:"Configuration parameters",permalink:"/documentation/operator/configuration_parameters"}},s={},h=[{value:"Rucio container code hot-patching",id:"rucio-container-code-hot-patching",level:2},{value:"Creating a patch from existing pull request",id:"creating-a-patch-from-existing-pull-request",level:3},{value:"Mounting a patch in a kubernetes cluster",id:"mounting-a-patch-in-a-kubernetes-cluster",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"rucio-container-code-hot-patching",children:"Rucio container code hot-patching"}),"\n",(0,o.jsx)(t.p,{children:"The rucio official containers provide a way to hotpatch the source code\nbefore running rucio. This behavior may be used to rapidly fix a production\ndeployment without having to wait for the change to be merged and released by\nthe rucio team."}),"\n",(0,o.jsxs)(t.p,{children:["The behavior is very simple: any file found in the ",(0,o.jsx)(t.code,{children:"/patch/*"})," directory inside\nthe containers will be fed to the ",(0,o.jsx)(t.code,{children:"patch"})," command-line tool in the order\nreturned by this glob matching."]}),"\n",(0,o.jsx)(t.p,{children:"The procedures described bellow are only intended for temporary fixes. If a\npermanent change is needed, we highly encourage you to open a pull request\nin rucio to spare you the toil related to maintaining your own local patch set."}),"\n",(0,o.jsx)(t.h3,{id:"creating-a-patch-from-existing-pull-request",children:"Creating a patch from existing pull request"}),"\n",(0,o.jsxs)(t.p,{children:["Lets assume you run rucio ",(0,o.jsx)(t.code,{children:"1.27.3"})," in production, and you realize there is\na bug in the ",(0,o.jsx)(t.code,{children:"conveyor-poller"})," daemon. You contact the rucio team and are\ntold that a fix was already done in the pull request\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/rucio/pull/5246/commits",children:"#5246"}),"\nand will be released next week. Follow\nthe following steps to create a patch file from this pull request without\nhaving to wait for the next rucio release to fix your issue:"]}),"\n",(0,o.jsx)(t.p,{children:"Clone the main rucio repository:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/rucio/rucio.git\ncd rucio\n# Create a new branch from the 1.27.3 release tag\ngit checkout 1.27.3 -b patch-0-hotfix_conveyor_poller_on_1.27.3\n"})}),"\n",(0,o.jsxs)(t.p,{children:["The #5246 pull request was submitted by the user ",(0,o.jsx)(t.code,{children:"rcarpa"})," from his rucio\nfork ",(0,o.jsx)(t.a,{href:"https://github.com/rcarpa/rucio",children:"rcarpa/rucio"}),". You'll have to add\nthis fork repository as a git remote:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git remote add rcarpa https://github.com/rcarpa/rucio.git\ngit fetch rcarpa\n# Cherry-pick the commit from the #5246 pull request.\n# Beware, some PR can have multiple commits\ngit cherry-pick 47d36345469ac9c1391cacd09487d4ec6ced627f\n"})}),"\n",(0,o.jsx)(t.p,{children:"Now you can create the patch with the differences between the rucio 1.27.3\nrelease and the current state of the repository:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git diff 1.27.3 > hotfix_conveyor_poller.patch\n"})}),"\n",(0,o.jsx)(t.h3,{id:"mounting-a-patch-in-a-kubernetes-cluster",children:"Mounting a patch in a kubernetes cluster"}),"\n",(0,o.jsxs)(t.p,{children:["If you deploy rucio in a kubernetes cluster using the official rucio\n",(0,o.jsx)(t.a,{href:"https://github.com/rucio/helm-charts/",children:"helm charts"})," and want to hotfix\nrucio using a patch file created in the previous section, follow these steps:"]}),"\n",(0,o.jsx)(t.p,{children:"Create a kubernetes secret from the hotfix patch:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"kubectl -n rucio create secret generic hotfix-conveyor-poller-patch --from-file=hotfix_conveyor_poller.patch\n"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.em,{children:"Note:"})," if you have more than one cluster, don't forget to create the\nsecrets in each cluster to be patched."]}),"\n",(0,o.jsxs)(t.p,{children:["Now you'll have to update the helm ",(0,o.jsx)(t.code,{children:"values"})," file for each helm release and\nadd the following"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:" secretMounts:\n - secretFullName: hotfix-conveyor-poller-patch\n mountPath: /patch/hotfix_conveyor_poller.patch\n subPath: hotfix_conveyor_poller.patch\n"})})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var o=n(96540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6323a9.21f6def8.js b/assets/js/1f6323a9.21f6def8.js deleted file mode 100644 index 74ca205482..0000000000 --- a/assets/js/1f6323a9.21f6def8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6068],{86155:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var i=t(74848),s=t(28453);const a={id:"streamedtables",title:"Using the WebUI StreamedTable Component"},l=void 0,o={id:"developer/webui/streamedtables",title:"Using the WebUI StreamedTable Component",description:"Data presentation in the WebUI",source:"@site/../docs/developer/webui/streamedtables.md",sourceDirName:"developer/webui",slug:"/developer/webui/streamedtables",permalink:"/documentation/developer/webui/streamedtables",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/streamedtables.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"streamedtables",title:"Using the WebUI StreamedTable Component"},sidebar:"docs",previous:{title:"Setting up a WebUI Developer Environment using Visual Studio Code",permalink:"/documentation/developer/webui/webui_frontend_vscode_dev_env"},next:{title:"Developing the WebUI Frontend",permalink:"/documentation/developer/webui/webui_frontend"}},r={},c=[{value:"Data presentation in the WebUI",id:"data-presentation-in-the-webui",level:2},{value:"StreamedTable",id:"streamedtable",level:2},{value:"TableColumns",id:"tablecolumns",level:3},{value:"Common components for column headers",id:"common-components-for-column-headers",level:3},{value:"TableSortUpDown",id:"tablesortupdown",level:4},{value:"TableFilterDiscrete",id:"tablefilterdiscrete",level:4},{value:"TableFilterBoolean",id:"tablefilterboolean",level:4},{value:"TableFilterString",id:"tablefilterstring",level:4},{value:"Common components for column cells",id:"common-components-for-column-cells",level:3},{value:"TableStyling",id:"tablestyling",level:3},{value:"Setting column widths",id:"setting-column-widths",level:3},{value:"TableSelecting",id:"tableselecting",level:3},{value:"NormalTable",id:"normaltable",level:3},{value:"StreamedTable in the context of NextJS",id:"streamedtable-in-the-context-of-nextjs",level:2},{value:"QueryClientProvider",id:"queryclientprovider",level:4},{value:"Route",id:"route",level:4}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"data-presentation-in-the-webui",children:"Data presentation in the WebUI"}),"\n",(0,i.jsx)(n.p,{children:'An issue we encountered in the process of developing the WebUI which is\nparticularly relevant in the context of writing a Rucio frontend is streaming.\nThe "old" web frontend (which we want to replace) had the issue that it would\nfreeze on starting larger queries, with no indication as to the progress made or\npotential errors encountered. Even when everything worked well, these "freezes"\ncould last for up to several minutes in which the page was effectively unusable.'}),"\n",(0,i.jsx)(n.p,{children:"The reason for this was the fact that any responses from the Rucio server (which\nsupports streaming) were stored in a WebUI intermediary, before being forwarded\nto the client in one batch. Since Rucio responses can be huge (and often, there\nis no prior indication of the size which a query will take), this could lead to\nfreezing of unknown duration."}),"\n",(0,i.jsxs)(n.p,{children:["The solution would be to pass the stream from Rucio through the WebUI\nbackend/core to the frontend. This required special software engineering on the\nbackend, which shall not be covered here. The frontend accesses the streams via\na system called the ",(0,i.jsx)(n.code,{children:"ComDOM"}),", short for ",(0,i.jsx)(n.code,{children:"Communication Document Object Model"}),".\nIt accesses the streams provided by the backend API layer (and NOT the Rucio\nserver itself) and wraps the data with further tooling (to start/pause/stop the\nstream, inspect the state, etc.)."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Streamed data is unavoidable in the WebUI. The UI accesses this data in the form\nof the ",(0,i.jsx)(n.code,{children:"ComDOM"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["The generic component when dealing with streamed data is the ",(0,i.jsx)(n.code,{children:"StreamedTable"}),",\nwhich is a custom HTML table framework based on ",(0,i.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/introduction",children:"Tanstack\nTable"})," and optimized for\nuse with the streams fed in via the ComDOM. A StreamedTable is defined by a set\nof react props passed into the component (which will be described below). The\nframework is completed by a plethora of ready-to-use components which solve the\nmajority of required usecases when it comes to streamed tables."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"StreamedTable Example",src:t(2119).A+"",width:"892",height:"456"})}),"\n",(0,i.jsx)(n.h2,{id:"streamedtable",children:"StreamedTable"}),"\n",(0,i.jsxs)(n.p,{children:["The StreamedTable is a fully typed react component based on the HTML ",(0,i.jsx)(n.code,{children:"table"})," element. The props it takes are defined in the codeblock below."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'type StreamedTableProps = JSX.IntrinsicElements["table"] & {\n tablecomdom: UseComDOM\n tablecolumns: any[]\n tablestyling?: TableStyling\n tableselecting?: TableSelecting\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The table expects a stream of elements of type ",(0,i.jsx)(n.code,{children:"T"}),", where ",(0,i.jsx)(n.code,{children:"T"})," extends the\n",(0,i.jsx)(n.code,{children:"BaseViewModel"}),". In practice, this means that an entity is wrapped in an object\nproviding status and an optional errormessage."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The data shown by the table is passed into the ",(0,i.jsx)(n.code,{children:"tablecomdom"})," prop as an\n",(0,i.jsx)(n.code,{children:"UseComDOM"})," object. This object also provides functions to inspect and control\nthe stream. The generic ",(0,i.jsx)(n.code,{children:"UseComDOM"})," type is bound to type ",(0,i.jsx)(n.code,{children:"T"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The table structure (i.e. the way data is structured into columns) is defined\nby the ",(0,i.jsx)(n.code,{children:"tablecolumns"})," prop. This is essentially an array of column definition\nobjects (which are taken from Tanstack Table), but there are exceptions, which\nmake typing this prop difficult. Most of your time building a streamedtable is\nspent writing this definition."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The first optional prop, ",(0,i.jsx)(n.code,{children:"tablestyling"})," is a structure containing style\ncommands for the table. The definition of the ",(0,i.jsx)(n.code,{children:"TableStyling"})," type is given\nbelow."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"tableselecting"}),' optionally defines how the user can select (single- or\nmulti-select) elements from the table. It also controls the "breakout"\nfunctionality. This is discussed later.']}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:'JSX.IntrinsicElements["table"]'})," means that the StreamedTable component will\nreturn a react component with the HTML ",(0,i.jsx)(n.code,{children:""})," tag as its top-level component,\nwhich in turn means that any valid HTML table-properties can be passed to the\nStreamedTable, and these will be passed on to the top-level component. This\nspecifically also includes styling the top-level ",(0,i.jsx)(n.code,{children:"
    "})," via ",(0,i.jsx)(n.code,{children:"className"})," but\nalso ARIA-properties."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"tablecolumns",children:"TableColumns"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"When creating a new component or editing a new one, it is very useful to view the table in Storybook."})}),"\n",(0,i.jsxs)(n.p,{children:["The definition of the tablecolumns can be taken from the\n",(0,i.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/guide/column-defs",children:"Tanstack Table Documentation"}),".\nA simple example shall be discussed here nonetheless. The following code snippet\nhas been adapted from ",(0,i.jsx)(n.code,{children:"PageDIDMetadata"}),", with custom styles and most custom\ncomponents removed for clarity."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'// imports and type definitions\nimport { createColumnHelper } from "@tanstack/react-table"\ntype DIDKeyValuePairViewModel = {\n // from DIDKeyValuePair entity\n key: string;\n value: string;\n\n // from BaseViewModel\n status: \'success\' | \'error\' | \'pending\';\n message?: string;\n}\n\n// the streamedtable receives a stream of `DIDKeyValuePairViewModel`\n// each element is converted into a row\n// initialise the columnHelper to this type\nconst columnHelper = createColumnHelper()\n\n\n// define the tablecolumns array\nconst tablecolumns: any[] = [\n // Accessor columns have an underlying data model which means they can be\n // sorted, filtered, grouped, etc.\n columnHelper.accessor("key", { // this column accesses the "key" attribute\n id: "key",\n // function to render each body cell of the column, return JSX object\n // "info" contains the value but also other useful context -> read docs\n cell: info => {\n return (\n \n {info.getValue()}\n \n )\n },\n // funxtion to render header cell of column, return JSX object\n // "info": context useful for the creation of a header cell -> read docs\n header: info => {\n return (\n // this is a custom component that can be placed into the header\n // they are discussed further below\n \n )\n }\n }\n ),\n columnHelper.accessor("value", { // column accesses the "value" attribute\n id: "value",\n cell: info => {\n return (\n {info.getValue()}\n )\n },\n header: info => {\n return (\n // must not use a custom component, a simple

    tag is fine!\n

    Value

    \n )\n }\n })\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:"Passing this column definition into a StreamedTable together with the ComDOM supplying the data like so"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"\n tablecomdom={comdom}\n tablecolumns={tablecolumns}\n/>\n"})}),"\n",(0,i.jsx)(n.p,{children:"will return a fully functional StreamedTable. This can be expanded upon to\ncreate much complex tables with multiple columns."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"The StreamedTable is a wrapper for Tanstack Table. In particular, the column\ndefinitions have been taken over unchanged. This means that the documentation\nand examples provided by Tanstack are also valid in the StreamedTables, check\nthem out."})}),"\n",(0,i.jsx)(n.h3,{id:"common-components-for-column-headers",children:"Common components for column headers"}),"\n",(0,i.jsxs)(n.p,{children:["A number of reusable components have been added to the StreamedTable package\nwhich can be used to implement frequently-needed functionality such as sorting\nand filtering. An example of this has already been given in the code above, in\nwhich a ",(0,i.jsx)(n.code,{children:"TableFilterString"})," component used."]}),"\n",(0,i.jsxs)(n.p,{children:["These components are added in the column header definitions within the\n",(0,i.jsx)(n.code,{children:"tablecolumns"})," definition, i.e."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n header: info => ,\n ...\n})\n'})}),"\n",(0,i.jsx)(n.p,{children:"The remainder of this section will introduce each of the common table\ncomponents."}),"\n",(0,i.jsx)(n.h4,{id:"tablesortupdown",children:"TableSortUpDown"}),"\n",(0,i.jsx)(n.p,{children:"This component toggles the Tanstack Table sorting mechanism on mouseclick and\ncycles between no sorting, sorting in ascending order and sorting in descending\norder. Examples of column entries which can be sorted are numeric data and\ndates."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableSortUpDown Dirty",src:t(12603).A+"",width:"154",height:"400"})," ",(0,i.jsx)(n.img,{alt:"TableFilterBoolean Clean",src:t(37624).A+"",width:"161",height:"401"})]}),"\n",(0,i.jsx)(n.p,{children:"It takes the following props:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'props: JSX.IntrinsicElements["div"] & {\n name: string\n column: Column\n element?: JSX.Element\n stack?: boolean\n nocollapse?: boolean\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"})," is the string which will be used as the column header with a default\nstyle if no ",(0,i.jsx)(n.code,{children:"element"})," is defined"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"column"})," is the table column the header belongs to."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"element"})," is the JSX element which overrides ",(0,i.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"stack"})," determines whether the icon signifying the sorting state and the name\nelement are stacked vertically instead of horizontally. The example picture\nabove uses vertical stacking."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"nocollapse"})," will force the ",(0,i.jsx)(n.code,{children:"name"})," (or ",(0,i.jsx)(n.code,{children:"element"}),") to remain visible even on\nsmall screen widths (below 768px)."]}),"\n",(0,i.jsxs)(n.li,{children:["any props valid for a ",(0,i.jsx)(n.code,{children:"div"})," element will also work."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterdiscrete",children:"TableFilterDiscrete"}),"\n",(0,i.jsx)(n.p,{children:"On mouseclick, it cycles through a list of keys and only displays the rows in\nwhich the column entry matches the key. Used when the column data is restricted\nto a small number of options, such as the Rucio enums."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableFilterDiscrete Dirty",src:t(52959).A+"",width:"236",height:"371"})," ",(0,i.jsx)(n.img,{alt:"TableFilterDiscrete Clean",src:t(52004).A+"",width:"232",height:"364"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type TableFilterDiscrete = JSX.IntrinsicElements["div"] & {\n name: string, // see TableSortUpDown\n keys: T[],\n renderFunc: (key: T | undefined) => JSX.Element,\n column: Column, // see TableSortUpDown\n stack?: boolean // see TableSortUpDown\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keys"})," is a list of type ",(0,i.jsx)(n.code,{children:"T"})," where ",(0,i.jsx)(n.code,{children:"T"})," is the tyoe of the column entries.\nUsually a string enum."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"renderFunc"})," is the function used to render the icon to the side or below the\ntext (depending on whether ",(0,i.jsx)(n.code,{children:"state"})," is set)."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterboolean",children:"TableFilterBoolean"}),"\n",(0,i.jsxs)(n.p,{children:["A special form of ",(0,i.jsx)(n.code,{children:"TableFilterDiscrete"})," in which the values are booleans. This\nmeans that no ",(0,i.jsx)(n.code,{children:"renderFunc"})," needs to be supplied."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"TableFilterBoolean in Action",src:t(18479).A+"",width:"430",height:"185"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'// see TableFilterDiscrete\ntype TableFilterBoolean = JSX.IntrinsicElements["div"] & {\n name: string,\n column: Column,\n stack?: boolean\n}\n'})}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterstring",children:"TableFilterString"}),"\n",(0,i.jsx)(n.p,{children:"A filter in which the column entries are strings."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableFilterString Dirty",src:t(86965).A+"",width:"828",height:"370"})," ",(0,i.jsx)(n.img,{alt:"TableFilterString Clean",src:t(22174).A+"",width:"825",height:"114"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type TableFilterString = JSX.IntrinsicElements["form"] & {\n column: Column, // see TableFilterDiscrete\n name: string, // see TableFilterDiscrete\n placeholder?: string,\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"placeholder"})," is the placeholder string for the textbox"]}),"\n",(0,i.jsxs)(n.li,{children:["this component is not derived from ",(0,i.jsx)(n.code,{children:"div"})," but from ",(0,i.jsx)(n.code,{children:"form"}),". Any attributes valid\nin ",(0,i.jsx)(n.code,{children:"form"})," are also valid here."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"These common StreamedTable components are very helpful in reducing the\ncomplexity of the column definitions you write. They also ensure a common design\nlanguage throughout the project. We encourage you to use them as much as\npossible."})}),"\n",(0,i.jsx)(n.h3,{id:"common-components-for-column-cells",children:"Common components for column cells"}),"\n",(0,i.jsx)(n.p,{children:"The selection here is quite limited right now, but shall be extended in order to\nkeep a common design language. It is also much easier to keep the project\naccessible if the total number of unique components is kept low."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableInternalLink"})," for links within the rucio webui"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableExternalLink"})," for links pointing outside of the rucio webui."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"tablestyling",children:"TableStyling"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["As with the rest of the Rucio WebUI, the StreamedTable is styled via ",(0,i.jsx)(n.a,{href:"https://tailwindcss.com/",children:"Tailwind\nCSS"}),". This means that styles are constructed by\nassigning various classes to an element. Tailwind will then compile a minimal\nset of CSS."]})}),"\n",(0,i.jsx)(n.p,{children:"This optional StreamedTable attribute itself only contains optional members. It\nis used to add to or override table styling settings."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"type TableStyling = Partial<{\n visibility?: Record\n tableHeadRowStyle?: string\n tableBodyRowStyle?: string\n pageSize?: number\n tableFooterStack?: boolean\n}>\n"})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"visibility"})," maps a column's visibility (boolean) to the column id (string)."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableHeadRowStyle"}),": the classes which shall get passed to the ",(0,i.jsx)(n.code,{children:"tr"})," in the\n",(0,i.jsx)(n.code,{children:"thead"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableBodyRowStyle"}),": the classes which shall get passed to each ",(0,i.jsx)(n.code,{children:"tr"})," in the\n",(0,i.jsx)(n.code,{children:"tbody"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"pageSize"})," is how many rows are shown per page at maximum."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableFooterStack"})," will stack table footer components in order to save\nhorizontal space."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"setting-column-widths",children:"Setting column widths"}),"\n",(0,i.jsx)(n.p,{children:"Column widths are set automatically, but they can be styled individually. This\nis done by adding a string of class names to the column definition in the\nfollowing way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n meta: {\n style: "w-28 md:w-56" // see tailwind documentation for an explanation\n },\n ...\n})\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The Tailwind compiler has been configured to consider these styles as well when\nputting together the minimal set of CSS. Internally, the styles defined here are\napplied to the header cell. Since the StreamedTable ",(0,i.jsx)(n.code,{children:"table"})," element uses\n",(0,i.jsx)(n.code,{children:"table-layout: fixed"}),", the column widths of the first row will be applied to\neach of the following rows as well."]}),"\n",(0,i.jsx)(n.h3,{id:"tableselecting",children:"TableSelecting"}),"\n",(0,i.jsx)(n.p,{children:'This optional table attribute handles selecting rows and the "breakout". The\nbreakout is an infopanel placed under the table which shows columns for a single\nselected row (these columns would otherwise be hidden due to lack of horizontal\nspace), see the image below for an example.'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"type TableSelecting = { // where T is the type of the table rows\n handleChange: (data: T[]) => void,\n enableRowSelection: boolean,\n enableMultiRowSelection?: boolean,\n breakOut?: {\n breakoutVisibility: boolean,\n keys: Record, // column id, displayname\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"handleChange"})," is the function which is run each time the selection state\nchanges."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"enableRowSelection"}),": whether to enable row selection"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"enableMultiRowSelection"}),": whether to allow row multi-select (only valid if\nrow selection is enabled)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"breakout.breakoutVisibility"}),": whether to allow showing the breakout when a\nrow is selected. Often coupled to the horizontal window size."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"breakout.keys"}),": matching column id to the name under which it is to be\ndisplayed. The column ids determine which columns are going to be added to the\nbreakout. Usually, these columns end up being the columns that were hidden due\nto lack of horizontal space."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Table Breakout",src:t(45955).A+"",width:"889",height:"588"})}),"\n",(0,i.jsx)(n.h3,{id:"normaltable",children:"NormalTable"}),"\n",(0,i.jsxs)(n.p,{children:["The StreamedTable design is part of the design language of the Rucio WebUI, and\nwe intend for all tables (even if they are non-streaming) to follow this design.\nIt follows that we created the ",(0,i.jsx)(n.code,{children:"NormalTable"}),", which keeps the same design as the\nStreamedTable but without the streaming capabilities."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type NormalTableProps = JSX.IntrinsicElements["table"] & {\n tablecolumns: any[] // see StreamedTable\n tablestyling?: TableStyling // see StreamedTable\n tableselecting?: TableSelecting // see StreamedTable\n tabledata: T[]\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tabledata"}),": instead of passing a comdom which wraps the streamed data, we pas\nthe data directly in the form of an array."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"streamedtable-in-the-context-of-nextjs",children:"StreamedTable in the context of NextJS"}),"\n",(0,i.jsx)(n.p,{children:"The StreamedTable relies on streams, which are rapped in the ComDOM. Until now,\nwe have taken the existence of a functioning ComDOM as given. In this section,\nwe will discuss how to properly embed the StreamedTable in the wider context of\nthe NextJS web application."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["The frontend uses the NextJS app router. ",(0,i.jsx)(n.a,{href:"https://nextjs.org/docs",children:"Look at their\ndocs"})," to learn more."]})}),"\n",(0,i.jsx)(n.h4,{id:"queryclientprovider",children:"QueryClientProvider"}),"\n",(0,i.jsx)(n.p,{children:"On a layout-file affecting the route containing the StreamedTable, include the\nfollowing code:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"'use client';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\n\nconst queryClient = new QueryClient();\n\nexport default function RootLayout({children}) {\n return (\n \n {children}\n \n )\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["where ",(0,i.jsx)(n.code,{children:"children"})," is a ",(0,i.jsx)(n.code,{children:"React.ReactNode"})," containing the StreamedTable."]}),"\n",(0,i.jsx)(n.h4,{id:"route",children:"Route"}),"\n",(0,i.jsxs)(n.p,{children:["On the route which returns the page including the StreamedTable, you must\ninitialise the ComDOM. You can optionally auto-start the ComDOM query or wait\nfor the user to trigger it manually -- this will not be covered in-depth here,\nsince this is more closely related to the ComDOM itself than to the\nStreamedTable. An example, taken and adapted from the ",(0,i.jsx)(n.code,{children:"ListSubscription"})," route,\nwould be:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'\'use client\';\nimport { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";\nimport { useEffect } from "react";\nimport useComDOM from "@/lib/infrastructure/hooks/useComDOM";\nimport { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";\n\nexport default function ListSubscription({ params }: { params: { account: string }}) {\n // initialise ComDOM\n const ComDOM = useComDOM(\n "subscription-rule-states-query",\n [],\n false,\n Infinity,\n 50,\n true\n )\n // auto-start query, GET data from /api/list-subscription, use param account\n useEffect(() => {\n const runQuery = async () => {\n await ComDOM.start({\n url: new URL("http://localhost:3000/api/list-subscription"),\n method: "GET",\n headers: new Headers({\n \'Content-Type\': \'application/json\'\n } as HeadersInit),\n params: {\n "account": params.account,\n }\n })\n }\n runQuery()\n }, [])\n // * return a react component\n // * in this case the StreamedTable is wrapped by a Storybook Page\n // * we pass the ComDOM to this page so that it may be passed further down\n // to the StreamedTable\n return (\n
    \n \n
    \n )\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},45955:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/breakout-bb5c25810ca88b4c2af415335d3d7d57.png"},18479:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-boolean-all-22de7b045ffd375da711fbeb0e3bfd63.png"},52004:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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"},52959:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-discrete-dirty-0910e099615f469d47dede0b1ab14040.png"},22174:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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OlqxQ3z81ri4uMTEhBMnvps5c6aRkdHkyZNZ15Url1nx58/Y5jTXrFm7efOmvn37fvrpulmzZr/77rs9e/YkoosX83meX7o08ubNm998838ZTiQSsY158+bv3bt34cKF77479Ny5c//617/EYt2QkJA2vwEAAAB4C3E8zyt/rqurJaKUlJSwsOlXr14xNzcnopiYmLi4DbduFWtra8vlclvbPnZ2dt9++z/skEOH0idPnnzp0q+WlpaspVcv86ampsLC37p3765cPCxsemZm5vXr17S0tIjo4MFDkyZNOnw43cfHp/VRyuVyPb0ea9eumT9/fptTio6O3rx5y717d4no6dOnYrHesGHDjh49wnqnT59x4cKF/PwLyof4+fmJxXopKf9WPmMr0/zpp5+GDft/n322bt68eURUUlJibd179+5d48ePV55sUVHRjz+eUj7R1atXXV3dli9f9s9//pO1LFy48NixzMuXC9qcFwAAALyFWl7QGjlylJaW1sGDB9nHAwdSR47019bWJqIrV66UlJQEB/9xPdTT892mpqZLly4pVxgxYnizoEZEFy6c9/DwYEGN7UNEP//8s2KH2tra6mcU1zGJSCgU2tvbb9u2PSEh4bfffmtqalIuW11dvWLFSldXN2PjnhKJ/mefRVdWVrKVPMbNzU2x7erqWlRU1NDQ0Pr30p5p9uvXj20YGRkJBIIHDx60XpOIvvsuh4gmTvyj7Lvvet66dUtxhRQAAABAWctZrXt3nf/6L7/U1DQiKioqunLlSlBQEOt6+PAhEc2dO08i0Wd/Nja2RCST/a5cwcTE9Pmy1dWPJBKJ0lm6q6urV1X9EVOCg0NMTEzZX2pqqvKx33yzf+jQoVFRawYOdLW27q38OoyQkEn79u2LiJh//Hjm2bNnIiIiiEg5q+nqihTbYrEuEZWWlrb+vbRnmiy8MhzHKYfL1su6uAxUlA0NDSUimUzW5rEAAADwFnrhc6DjxgUFBwffvn37wIEDYrF4+PDhrJ2FrS+//GLIkCHK+xsaGip/FAqFz9cUi3UrKioUH2tqahobG/X0xIqW6OjPKiuXsu0+fWyVjzU3N9++fRsRFRYWrlz5yfz5EcOGDbOysiotLc3JydmxY3twcDDbUzmlMeXlD5ttS6XSF038pab5siQSCcdxJ09+361bN+V2CwuLP1MWAAAAuqoX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"},86965:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-string-dirty-dadee973219a779404cf2c4443cc5ee3.png"},37624:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-clean-18a717b9686dfecb04d47a3f794daf68.png"},12603:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-dirty-2148a91f5adf2a2c0272b096834b8c98.png"},2119:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/streamedtable-4cf5d169c74626898e013335a0a4d34a.png"},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6323a9.4570f455.js b/assets/js/1f6323a9.4570f455.js new file mode 100644 index 0000000000..06c2d32d21 --- /dev/null +++ b/assets/js/1f6323a9.4570f455.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6068],{86155:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var i=t(74848),s=t(28453);const a={id:"streamedtables",title:"Using the WebUI StreamedTable Component"},l=void 0,o={id:"developer/webui/streamedtables",title:"Using the WebUI StreamedTable Component",description:"Data presentation in the WebUI",source:"@site/../docs/developer/webui/streamedtables.md",sourceDirName:"developer/webui",slug:"/developer/webui/streamedtables",permalink:"/documentation/developer/webui/streamedtables",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/streamedtables.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"streamedtables",title:"Using the WebUI StreamedTable Component"},sidebar:"docs",previous:{title:"Setting up a WebUI Developer Environment using Visual Studio Code",permalink:"/documentation/developer/webui/webui_frontend_vscode_dev_env"},next:{title:"Developing the WebUI Frontend",permalink:"/documentation/developer/webui/webui_frontend"}},r={},c=[{value:"Data presentation in the WebUI",id:"data-presentation-in-the-webui",level:2},{value:"StreamedTable",id:"streamedtable",level:2},{value:"TableColumns",id:"tablecolumns",level:3},{value:"Common components for column headers",id:"common-components-for-column-headers",level:3},{value:"TableSortUpDown",id:"tablesortupdown",level:4},{value:"TableFilterDiscrete",id:"tablefilterdiscrete",level:4},{value:"TableFilterBoolean",id:"tablefilterboolean",level:4},{value:"TableFilterString",id:"tablefilterstring",level:4},{value:"Common components for column cells",id:"common-components-for-column-cells",level:3},{value:"TableStyling",id:"tablestyling",level:3},{value:"Setting column widths",id:"setting-column-widths",level:3},{value:"TableSelecting",id:"tableselecting",level:3},{value:"NormalTable",id:"normaltable",level:3},{value:"StreamedTable in the context of NextJS",id:"streamedtable-in-the-context-of-nextjs",level:2},{value:"QueryClientProvider",id:"queryclientprovider",level:4},{value:"Route",id:"route",level:4}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"data-presentation-in-the-webui",children:"Data presentation in the WebUI"}),"\n",(0,i.jsx)(n.p,{children:'An issue we encountered in the process of developing the WebUI which is\nparticularly relevant in the context of writing a Rucio frontend is streaming.\nThe "old" web frontend (which we want to replace) had the issue that it would\nfreeze on starting larger queries, with no indication as to the progress made or\npotential errors encountered. Even when everything worked well, these "freezes"\ncould last for up to several minutes in which the page was effectively unusable.'}),"\n",(0,i.jsx)(n.p,{children:"The reason for this was the fact that any responses from the Rucio server (which\nsupports streaming) were stored in a WebUI intermediary, before being forwarded\nto the client in one batch. Since Rucio responses can be huge (and often, there\nis no prior indication of the size which a query will take), this could lead to\nfreezing of unknown duration."}),"\n",(0,i.jsxs)(n.p,{children:["The solution would be to pass the stream from Rucio through the WebUI\nbackend/core to the frontend. This required special software engineering on the\nbackend, which shall not be covered here. The frontend accesses the streams via\na system called the ",(0,i.jsx)(n.code,{children:"ComDOM"}),", short for ",(0,i.jsx)(n.code,{children:"Communication Document Object Model"}),".\nIt accesses the streams provided by the backend API layer (and NOT the Rucio\nserver itself) and wraps the data with further tooling (to start/pause/stop the\nstream, inspect the state, etc.)."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Streamed data is unavoidable in the WebUI. The UI accesses this data in the form\nof the ",(0,i.jsx)(n.code,{children:"ComDOM"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["The generic component when dealing with streamed data is the ",(0,i.jsx)(n.code,{children:"StreamedTable"}),",\nwhich is a custom HTML table framework based on ",(0,i.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/introduction",children:"Tanstack\nTable"})," and optimized for\nuse with the streams fed in via the ComDOM. A StreamedTable is defined by a set\nof react props passed into the component (which will be described below). The\nframework is completed by a plethora of ready-to-use components which solve the\nmajority of required usecases when it comes to streamed tables."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"StreamedTable Example",src:t(2119).A+"",width:"892",height:"456"})}),"\n",(0,i.jsx)(n.h2,{id:"streamedtable",children:"StreamedTable"}),"\n",(0,i.jsxs)(n.p,{children:["The StreamedTable is a fully typed react component based on the HTML ",(0,i.jsx)(n.code,{children:"table"})," element. The props it takes are defined in the codeblock below."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'type StreamedTableProps = JSX.IntrinsicElements["table"] & {\n tablecomdom: UseComDOM\n tablecolumns: any[]\n tablestyling?: TableStyling\n tableselecting?: TableSelecting\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The table expects a stream of elements of type ",(0,i.jsx)(n.code,{children:"T"}),", where ",(0,i.jsx)(n.code,{children:"T"})," extends the\n",(0,i.jsx)(n.code,{children:"BaseViewModel"}),". In practice, this means that an entity is wrapped in an object\nproviding status and an optional errormessage."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The data shown by the table is passed into the ",(0,i.jsx)(n.code,{children:"tablecomdom"})," prop as an\n",(0,i.jsx)(n.code,{children:"UseComDOM"})," object. This object also provides functions to inspect and control\nthe stream. The generic ",(0,i.jsx)(n.code,{children:"UseComDOM"})," type is bound to type ",(0,i.jsx)(n.code,{children:"T"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The table structure (i.e. the way data is structured into columns) is defined\nby the ",(0,i.jsx)(n.code,{children:"tablecolumns"})," prop. This is essentially an array of column definition\nobjects (which are taken from Tanstack Table), but there are exceptions, which\nmake typing this prop difficult. Most of your time building a streamedtable is\nspent writing this definition."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The first optional prop, ",(0,i.jsx)(n.code,{children:"tablestyling"})," is a structure containing style\ncommands for the table. The definition of the ",(0,i.jsx)(n.code,{children:"TableStyling"})," type is given\nbelow."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"tableselecting"}),' optionally defines how the user can select (single- or\nmulti-select) elements from the table. It also controls the "breakout"\nfunctionality. This is discussed later.']}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:'JSX.IntrinsicElements["table"]'})," means that the StreamedTable component will\nreturn a react component with the HTML ",(0,i.jsx)(n.code,{children:"
    "})," tag as its top-level component,\nwhich in turn means that any valid HTML table-properties can be passed to the\nStreamedTable, and these will be passed on to the top-level component. This\nspecifically also includes styling the top-level ",(0,i.jsx)(n.code,{children:"
    "})," via ",(0,i.jsx)(n.code,{children:"className"})," but\nalso ARIA-properties."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"tablecolumns",children:"TableColumns"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"When creating a new component or editing a new one, it is very useful to view the table in Storybook."})}),"\n",(0,i.jsxs)(n.p,{children:["The definition of the tablecolumns can be taken from the\n",(0,i.jsx)(n.a,{href:"https://tanstack.com/table/v8/docs/guide/column-defs",children:"Tanstack Table Documentation"}),".\nA simple example shall be discussed here nonetheless. The following code snippet\nhas been adapted from ",(0,i.jsx)(n.code,{children:"PageDIDMetadata"}),", with custom styles and most custom\ncomponents removed for clarity."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'// imports and type definitions\nimport { createColumnHelper } from "@tanstack/react-table"\ntype DIDKeyValuePairViewModel = {\n // from DIDKeyValuePair entity\n key: string;\n value: string;\n\n // from BaseViewModel\n status: \'success\' | \'error\' | \'pending\';\n message?: string;\n}\n\n// the streamedtable receives a stream of `DIDKeyValuePairViewModel`\n// each element is converted into a row\n// initialise the columnHelper to this type\nconst columnHelper = createColumnHelper()\n\n\n// define the tablecolumns array\nconst tablecolumns: any[] = [\n // Accessor columns have an underlying data model which means they can be\n // sorted, filtered, grouped, etc.\n columnHelper.accessor("key", { // this column accesses the "key" attribute\n id: "key",\n // function to render each body cell of the column, return JSX object\n // "info" contains the value but also other useful context -> read docs\n cell: info => {\n return (\n \n {info.getValue()}\n \n )\n },\n // funxtion to render header cell of column, return JSX object\n // "info": context useful for the creation of a header cell -> read docs\n header: info => {\n return (\n // this is a custom component that can be placed into the header\n // they are discussed further below\n \n )\n }\n }\n ),\n columnHelper.accessor("value", { // column accesses the "value" attribute\n id: "value",\n cell: info => {\n return (\n {info.getValue()}\n )\n },\n header: info => {\n return (\n // must not use a custom component, a simple

    tag is fine!\n

    Value

    \n )\n }\n })\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:"Passing this column definition into a StreamedTable together with the ComDOM supplying the data like so"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"\n tablecomdom={comdom}\n tablecolumns={tablecolumns}\n/>\n"})}),"\n",(0,i.jsx)(n.p,{children:"will return a fully functional StreamedTable. This can be expanded upon to\ncreate much complex tables with multiple columns."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"The StreamedTable is a wrapper for Tanstack Table. In particular, the column\ndefinitions have been taken over unchanged. This means that the documentation\nand examples provided by Tanstack are also valid in the StreamedTables, check\nthem out."})}),"\n",(0,i.jsx)(n.h3,{id:"common-components-for-column-headers",children:"Common components for column headers"}),"\n",(0,i.jsxs)(n.p,{children:["A number of reusable components have been added to the StreamedTable package\nwhich can be used to implement frequently-needed functionality such as sorting\nand filtering. An example of this has already been given in the code above, in\nwhich a ",(0,i.jsx)(n.code,{children:"TableFilterString"})," component used."]}),"\n",(0,i.jsxs)(n.p,{children:["These components are added in the column header definitions within the\n",(0,i.jsx)(n.code,{children:"tablecolumns"})," definition, i.e."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n header: info => ,\n ...\n})\n'})}),"\n",(0,i.jsx)(n.p,{children:"The remainder of this section will introduce each of the common table\ncomponents."}),"\n",(0,i.jsx)(n.h4,{id:"tablesortupdown",children:"TableSortUpDown"}),"\n",(0,i.jsx)(n.p,{children:"This component toggles the Tanstack Table sorting mechanism on mouseclick and\ncycles between no sorting, sorting in ascending order and sorting in descending\norder. Examples of column entries which can be sorted are numeric data and\ndates."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableSortUpDown Dirty",src:t(12603).A+"",width:"154",height:"400"})," ",(0,i.jsx)(n.img,{alt:"TableFilterBoolean Clean",src:t(37624).A+"",width:"161",height:"401"})]}),"\n",(0,i.jsx)(n.p,{children:"It takes the following props:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'props: JSX.IntrinsicElements["div"] & {\n name: string\n column: Column\n element?: JSX.Element\n stack?: boolean\n nocollapse?: boolean\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"})," is the string which will be used as the column header with a default\nstyle if no ",(0,i.jsx)(n.code,{children:"element"})," is defined"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"column"})," is the table column the header belongs to."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"element"})," is the JSX element which overrides ",(0,i.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"stack"})," determines whether the icon signifying the sorting state and the name\nelement are stacked vertically instead of horizontally. The example picture\nabove uses vertical stacking."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"nocollapse"})," will force the ",(0,i.jsx)(n.code,{children:"name"})," (or ",(0,i.jsx)(n.code,{children:"element"}),") to remain visible even on\nsmall screen widths (below 768px)."]}),"\n",(0,i.jsxs)(n.li,{children:["any props valid for a ",(0,i.jsx)(n.code,{children:"div"})," element will also work."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterdiscrete",children:"TableFilterDiscrete"}),"\n",(0,i.jsx)(n.p,{children:"On mouseclick, it cycles through a list of keys and only displays the rows in\nwhich the column entry matches the key. Used when the column data is restricted\nto a small number of options, such as the Rucio enums."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableFilterDiscrete Dirty",src:t(52959).A+"",width:"236",height:"371"})," ",(0,i.jsx)(n.img,{alt:"TableFilterDiscrete Clean",src:t(52004).A+"",width:"232",height:"364"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type TableFilterDiscrete = JSX.IntrinsicElements["div"] & {\n name: string, // see TableSortUpDown\n keys: T[],\n renderFunc: (key: T | undefined) => JSX.Element,\n column: Column, // see TableSortUpDown\n stack?: boolean // see TableSortUpDown\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keys"})," is a list of type ",(0,i.jsx)(n.code,{children:"T"})," where ",(0,i.jsx)(n.code,{children:"T"})," is the tyoe of the column entries.\nUsually a string enum."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"renderFunc"})," is the function used to render the icon to the side or below the\ntext (depending on whether ",(0,i.jsx)(n.code,{children:"state"})," is set)."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterboolean",children:"TableFilterBoolean"}),"\n",(0,i.jsxs)(n.p,{children:["A special form of ",(0,i.jsx)(n.code,{children:"TableFilterDiscrete"})," in which the values are booleans. This\nmeans that no ",(0,i.jsx)(n.code,{children:"renderFunc"})," needs to be supplied."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"TableFilterBoolean in Action",src:t(18479).A+"",width:"430",height:"185"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'// see TableFilterDiscrete\ntype TableFilterBoolean = JSX.IntrinsicElements["div"] & {\n name: string,\n column: Column,\n stack?: boolean\n}\n'})}),"\n",(0,i.jsx)(n.h4,{id:"tablefilterstring",children:"TableFilterString"}),"\n",(0,i.jsx)(n.p,{children:"A filter in which the column entries are strings."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.img,{alt:"TableFilterString Dirty",src:t(86965).A+"",width:"828",height:"370"})," ",(0,i.jsx)(n.img,{alt:"TableFilterString Clean",src:t(22174).A+"",width:"825",height:"114"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type TableFilterString = JSX.IntrinsicElements["form"] & {\n column: Column, // see TableFilterDiscrete\n name: string, // see TableFilterDiscrete\n placeholder?: string,\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"placeholder"})," is the placeholder string for the textbox"]}),"\n",(0,i.jsxs)(n.li,{children:["this component is not derived from ",(0,i.jsx)(n.code,{children:"div"})," but from ",(0,i.jsx)(n.code,{children:"form"}),". Any attributes valid\nin ",(0,i.jsx)(n.code,{children:"form"})," are also valid here."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"These common StreamedTable components are very helpful in reducing the\ncomplexity of the column definitions you write. They also ensure a common design\nlanguage throughout the project. We encourage you to use them as much as\npossible."})}),"\n",(0,i.jsx)(n.h3,{id:"common-components-for-column-cells",children:"Common components for column cells"}),"\n",(0,i.jsx)(n.p,{children:"The selection here is quite limited right now, but shall be extended in order to\nkeep a common design language. It is also much easier to keep the project\naccessible if the total number of unique components is kept low."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableInternalLink"})," for links within the rucio webui"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableExternalLink"})," for links pointing outside of the rucio webui."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"tablestyling",children:"TableStyling"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["As with the rest of the Rucio WebUI, the StreamedTable is styled via ",(0,i.jsx)(n.a,{href:"https://tailwindcss.com/",children:"Tailwind\nCSS"}),". This means that styles are constructed by\nassigning various classes to an element. Tailwind will then compile a minimal\nset of CSS."]})}),"\n",(0,i.jsx)(n.p,{children:"This optional StreamedTable attribute itself only contains optional members. It\nis used to add to or override table styling settings."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"type TableStyling = Partial<{\n visibility?: Record\n tableHeadRowStyle?: string\n tableBodyRowStyle?: string\n pageSize?: number\n tableFooterStack?: boolean\n}>\n"})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"visibility"})," maps a column's visibility (boolean) to the column id (string)."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableHeadRowStyle"}),": the classes which shall get passed to the ",(0,i.jsx)(n.code,{children:"tr"})," in the\n",(0,i.jsx)(n.code,{children:"thead"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableBodyRowStyle"}),": the classes which shall get passed to each ",(0,i.jsx)(n.code,{children:"tr"})," in the\n",(0,i.jsx)(n.code,{children:"tbody"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"pageSize"})," is how many rows are shown per page at maximum."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tableFooterStack"})," will stack table footer components in order to save\nhorizontal space."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"setting-column-widths",children:"Setting column widths"}),"\n",(0,i.jsx)(n.p,{children:"Column widths are set automatically, but they can be styled individually. This\nis done by adding a string of class names to the column definition in the\nfollowing way:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'columnHelper.accessor("foo", {\n meta: {\n style: "w-28 md:w-56" // see tailwind documentation for an explanation\n },\n ...\n})\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The Tailwind compiler has been configured to consider these styles as well when\nputting together the minimal set of CSS. Internally, the styles defined here are\napplied to the header cell. Since the StreamedTable ",(0,i.jsx)(n.code,{children:"table"})," element uses\n",(0,i.jsx)(n.code,{children:"table-layout: fixed"}),", the column widths of the first row will be applied to\neach of the following rows as well."]}),"\n",(0,i.jsx)(n.h3,{id:"tableselecting",children:"TableSelecting"}),"\n",(0,i.jsx)(n.p,{children:'This optional table attribute handles selecting rows and the "breakout". The\nbreakout is an infopanel placed under the table which shows columns for a single\nselected row (these columns would otherwise be hidden due to lack of horizontal\nspace), see the image below for an example.'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"type TableSelecting = { // where T is the type of the table rows\n handleChange: (data: T[]) => void,\n enableRowSelection: boolean,\n enableMultiRowSelection?: boolean,\n breakOut?: {\n breakoutVisibility: boolean,\n keys: Record, // column id, displayname\n }\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"handleChange"})," is the function which is run each time the selection state\nchanges."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"enableRowSelection"}),": whether to enable row selection"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"enableMultiRowSelection"}),": whether to allow row multi-select (only valid if\nrow selection is enabled)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"breakout.breakoutVisibility"}),": whether to allow showing the breakout when a\nrow is selected. Often coupled to the horizontal window size."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"breakout.keys"}),": matching column id to the name under which it is to be\ndisplayed. The column ids determine which columns are going to be added to the\nbreakout. Usually, these columns end up being the columns that were hidden due\nto lack of horizontal space."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Table Breakout",src:t(45955).A+"",width:"889",height:"588"})}),"\n",(0,i.jsx)(n.h3,{id:"normaltable",children:"NormalTable"}),"\n",(0,i.jsxs)(n.p,{children:["The StreamedTable design is part of the design language of the Rucio WebUI, and\nwe intend for all tables (even if they are non-streaming) to follow this design.\nIt follows that we created the ",(0,i.jsx)(n.code,{children:"NormalTable"}),", which keeps the same design as the\nStreamedTable but without the streaming capabilities."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'type NormalTableProps = JSX.IntrinsicElements["table"] & {\n tablecolumns: any[] // see StreamedTable\n tablestyling?: TableStyling // see StreamedTable\n tableselecting?: TableSelecting // see StreamedTable\n tabledata: T[]\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Explanation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"tabledata"}),": instead of passing a comdom which wraps the streamed data, we pas\nthe data directly in the form of an array."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"streamedtable-in-the-context-of-nextjs",children:"StreamedTable in the context of NextJS"}),"\n",(0,i.jsx)(n.p,{children:"The StreamedTable relies on streams, which are rapped in the ComDOM. Until now,\nwe have taken the existence of a functioning ComDOM as given. In this section,\nwe will discuss how to properly embed the StreamedTable in the wider context of\nthe NextJS web application."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["The frontend uses the NextJS app router. ",(0,i.jsx)(n.a,{href:"https://nextjs.org/docs",children:"Look at their\ndocs"})," to learn more."]})}),"\n",(0,i.jsx)(n.h4,{id:"queryclientprovider",children:"QueryClientProvider"}),"\n",(0,i.jsx)(n.p,{children:"On a layout-file affecting the route containing the StreamedTable, include the\nfollowing code:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:"'use client';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\n\nconst queryClient = new QueryClient();\n\nexport default function RootLayout({children}) {\n return (\n \n {children}\n \n )\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["where ",(0,i.jsx)(n.code,{children:"children"})," is a ",(0,i.jsx)(n.code,{children:"React.ReactNode"})," containing the StreamedTable."]}),"\n",(0,i.jsx)(n.h4,{id:"route",children:"Route"}),"\n",(0,i.jsxs)(n.p,{children:["On the route which returns the page including the StreamedTable, you must\ninitialise the ComDOM. You can optionally auto-start the ComDOM query or wait\nfor the user to trigger it manually -- this will not be covered in-depth here,\nsince this is more closely related to the ComDOM itself than to the\nStreamedTable. An example, taken and adapted from the ",(0,i.jsx)(n.code,{children:"ListSubscription"})," route,\nwould be:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-tsx",children:'\'use client\';\nimport { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";\nimport { useEffect } from "react";\nimport useComDOM from "@/lib/infrastructure/hooks/useComDOM";\nimport { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";\n\nexport default function ListSubscription({ params }: { params: { account: string }}) {\n // initialise ComDOM\n const ComDOM = useComDOM(\n "subscription-rule-states-query",\n [],\n false,\n Infinity,\n 50,\n true\n )\n // auto-start query, GET data from /api/list-subscription, use param account\n useEffect(() => {\n const runQuery = async () => {\n await ComDOM.start({\n url: new URL("http://localhost:3000/api/list-subscription"),\n method: "GET",\n headers: new Headers({\n \'Content-Type\': \'application/json\'\n } as HeadersInit),\n params: {\n "account": params.account,\n }\n })\n }\n runQuery()\n }, [])\n // * return a react component\n // * in this case the StreamedTable is wrapped by a Storybook Page\n // * we pass the ComDOM to this page so that it may be passed further down\n // to the StreamedTable\n return (\n
    \n \n
    \n )\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},45955:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/breakout-bb5c25810ca88b4c2af415335d3d7d57.png"},18479:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-boolean-all-22de7b045ffd375da711fbeb0e3bfd63.png"},52004:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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"},52959:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-discrete-dirty-0910e099615f469d47dede0b1ab14040.png"},22174:(e,n,t)=>{t.d(n,{A:()=>i});const i="data:image/png;base64,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OlqxQ3z81ri4uMTEhBMnvps5c6aRkdHkyZNZ15Url1nx58/Y5jTXrFm7efOmvn37fvrpulmzZr/77rs9e/YkoosX83meX7o08ubNm998838ZTiQSsY158+bv3bt34cKF77479Ny5c//617/EYt2QkJA2vwEAAAB4C3E8zyt/rqurJaKUlJSwsOlXr14xNzcnopiYmLi4DbduFWtra8vlclvbPnZ2dt9++z/skEOH0idPnnzp0q+WlpaspVcv86ampsLC37p3765cPCxsemZm5vXr17S0tIjo4MFDkyZNOnw43cfHp/VRyuVyPb0ea9eumT9/fptTio6O3rx5y717d4no6dOnYrHesGHDjh49wnqnT59x4cKF/PwLyof4+fmJxXopKf9WPmMr0/zpp5+GDft/n322bt68eURUUlJibd179+5d48ePV55sUVHRjz+eUj7R1atXXV3dli9f9s9//pO1LFy48NixzMuXC9qcFwAAALyFWl7QGjlylJaW1sGDB9nHAwdSR47019bWJqIrV66UlJQEB/9xPdTT892mpqZLly4pVxgxYnizoEZEFy6c9/DwYEGN7UNEP//8s2KH2tra6mcU1zGJSCgU2tvbb9u2PSEh4bfffmtqalIuW11dvWLFSldXN2PjnhKJ/mefRVdWVrKVPMbNzU2x7erqWlRU1NDQ0Pr30p5p9uvXj20YGRkJBIIHDx60XpOIvvsuh4gmTvyj7Lvvet66dUtxhRQAAABAWctZrXt3nf/6L7/U1DQiKioqunLlSlBQEOt6+PAhEc2dO08i0Wd/Nja2RCST/a5cwcTE9Pmy1dWPJBKJ0lm6q6urV1X9EVOCg0NMTEzZX2pqqvKx33yzf+jQoVFRawYOdLW27q38OoyQkEn79u2LiJh//Hjm2bNnIiIiiEg5q+nqihTbYrEuEZWWlrb+vbRnmiy8MhzHKYfL1su6uAxUlA0NDSUimUzW5rEAAADwFnrhc6DjxgUFBwffvn37wIEDYrF4+PDhrJ2FrS+//GLIkCHK+xsaGip/FAqFz9cUi3UrKioUH2tqahobG/X0xIqW6OjPKiuXsu0+fWyVjzU3N9++fRsRFRYWrlz5yfz5EcOGDbOysiotLc3JydmxY3twcDDbUzmlMeXlD5ttS6XSF038pab5siQSCcdxJ09+361bN+V2CwuLP1MWAAAAuqoX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"},86965:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/filter-string-dirty-dadee973219a779404cf2c4443cc5ee3.png"},37624:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-clean-18a717b9686dfecb04d47a3f794daf68.png"},12603:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/sort-updown-dirty-2148a91f5adf2a2c0272b096834b8c98.png"},2119:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/streamedtable-4cf5d169c74626898e013335a0a4d34a.png"},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6484bf.458ee9bf.js b/assets/js/1f6484bf.458ee9bf.js deleted file mode 100644 index 3971b75a42..0000000000 --- a/assets/js/1f6484bf.458ee9bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5680],{47767:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=i(74848),t=i(28453);const o={id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},r=void 0,c={id:"developer/setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code",description:"Local Setup vs Remote Setup",source:"@site/../docs/developer/setting_up_vscode_dev_env.md",sourceDirName:"developer",slug:"/developer/setting_up_vscode_dev_env",permalink:"/documentation/developer/setting_up_vscode_dev_env",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/setting_up_vscode_dev_env.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},sidebar:"docs",previous:{title:"Setting up a Rucio Developer environment using IntelliJ Ultimate",permalink:"/documentation/developer/setting_up_intellij_dev_env"},next:{title:"Contributing Guide",permalink:"/documentation/contributing"}},d={},l=[{value:"Local Setup vs Remote Setup",id:"local-setup-vs-remote-setup",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Remote Only: Additional Setup VSCode",id:"remote-only-additional-setup-vscode",level:3},{value:"VSCode Extensions",id:"vscode-extensions",level:3},{value:"Docker and Docker Compose",id:"docker-and-docker-compose",level:3},{value:"SSL Certificates",id:"ssl-certificates",level:3},{value:"Setting up Rucio and Configuring VSCode",id:"setting-up-rucio-and-configuring-vscode",level:2},{value:"VSCode Tasks",id:"vscode-tasks",level:2},{value:"Starting Rucio",id:"starting-rucio",level:3},{value:"Stopping Rucio",id:"stopping-rucio",level:3},{value:"Debugging Overview",id:"debugging-overview",level:2},{value:"Debugging Rucio Server",id:"debugging-rucio-server",level:3},{value:"Debugging Rucio WebUI",id:"debugging-rucio-webui",level:3},{value:"Debugging Rucio CLI Clients ( rucio-admin and rucio)",id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",level:3},{value:"Debug rucio cli client",id:"debug-rucio-cli-client",level:4},{value:"Debug rucio-admin client",id:"debug-rucio-admin-client",level:4},{value:"Debugging Rucio Tests",id:"debugging-rucio-tests",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"local-setup-vs-remote-setup",children:"Local Setup vs Remote Setup"}),"\n",(0,s.jsx)(n.p,{children:"It is possible to run the containers for rucio development locally or on a remote VM."}),"\n",(0,s.jsxs)(n.p,{children:["For local development machines with limited resources ",(0,s.jsx)(n.code,{children:"(<16 GB RAM, < 4 Cores)"}),", it is recommended to run the containers on a remote VM. This will allow you to use your local machine for other tasks while the containers are running on the remote VM."]}),"\n",(0,s.jsxs)(n.p,{children:["Local development has been tested only on Linux hosts.\nRemote development has been tested on Linux(for the remote VM) and Linux/MacOS(for the local instance of vscode).\nThe additional steps required for setting up a remote development environment are described in the sections begininng with ",(0,s.jsx)(n.code,{children:"Remote Only: "}),". These sections can be ignored if you are setting up a local development environment."]}),"\n",(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/Download",children:"Visual Studio Code"})]}),"\n",(0,s.jsx)(n.h3,{id:"remote-only-additional-setup-vscode",children:"Remote Only: Additional Setup VSCode"}),"\n",(0,s.jsxs)(n.p,{children:["For development on a remote VM, you will need to install the ",(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack",children:"Remote Development Extension Pack"})]}),"\n",(0,s.jsxs)(n.p,{children:["You should setup SSH access to your remote VM. For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Remote-SSH: Open SSH Configuration File"}),"\n",(0,s.jsx)(n.img,{alt:"Open SSH Configuration File",src:i(67403).A+"",width:"609",height:"270"})]}),"\n",(0,s.jsxs)(n.p,{children:["You will be asked to create a new SSH configuration file or select an existing one. If you have an existing SSH configuration file, select it. If you do not have an existing SSH configuration file, select ",(0,s.jsx)(n.code,{children:"Create New File"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Update the SSH configuration file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host \n HostName \n User \n"})}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, you can use the ",(0,s.jsx)(n.code,{children:"IdentityFile"})," option to specify the SSH key to use for authentication. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host \n HostName \n User \n IdentityFile ~/.ssh/\n"})}),"\n",(0,s.jsx)(n.p,{children:"If your remote VM is behind a firewall, you will need to setup a proxy. For example, at CERN, we can use lxplus as a ssh proxy to connect to the remote VMs, which are not accessible outside the CERN network. The following is an example of an SSH configuration file that uses lxplus as a proxy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host lxplus\n HostName lxplus.cern.ch\n User \n\nHost \n HostName \n User \n ProxyCommand ssh -q -W %h:%p lxplus\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Test connection to Remote VM"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Remote-SSH: Connect to Host..."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select the remote VM from the list of hosts"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Depending on your SSH Configuration, you may be prompted for the password/s in the following order:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"remote user on the proxy host"}),"\n",(0,s.jsx)(n.li,{children:"ssh key password or the password of the remote VMs user."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The bottom right corner of VS Code will show the status of the connection. If the connection is successful, you will see ",(0,s.jsx)(n.code,{children:"SSH: "})," in the bottom right corner:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Successful Connection",src:i(76587).A+"",width:"354",height:"108"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["For troubleshooting and Tips/Tricks, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/troubleshooting",children:"Troubleshooting"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"NOTE for remote development"}),": From hereon out, all the instructions should be run in the VSCode instance connected to your remote VM. ( i.e. the VSCode instance that shows ",(0,s.jsx)(n.code,{children:"SSH: "})," in the bottom right corner)\nYou can use the terminal in the VSCode instance to run commands on the remote VM directly. To do so, open the terminal in VSCode instance connected to your remote VM by clicking on ",(0,s.jsx)(n.code,{children:"Terminal"})," in the menu bar and then clicking on ",(0,s.jsx)(n.code,{children:"New Terminal"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"vscode-extensions",children:"VSCode Extensions"}),"\n",(0,s.jsx)(n.p,{children:"Install the following extensions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.python",children:"Python"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance",children:"Pylance"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker",children:"Docker"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote - Containers"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["VSCode comes with a plethora of extensions that can significantly improve your development experience. For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/editor/extension-gallery",children:"Extensions"})]}),"\n",(0,s.jsx)(n.h3,{id:"docker-and-docker-compose",children:"Docker and Docker Compose"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})]}),"\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"ssl-certificates",children:"SSL Certificates"}),"\n",(0,s.jsxs)(n.p,{children:["If you would like to debug the rucio webui and x509 authentication capabilities of the rucio server, you will need to obtain SSL certificates for your development environment. For remote VMs, you can request them from your IT department or you can use letsencrypt to generate a certificate. For local development machines, you can use ",(0,s.jsx)(n.a,{href:"https://github.com/FiloSottile/mkcert",children:"mkcert"})," to generate a certificate."]}),"\n",(0,s.jsxs)(n.p,{children:["Whatever route you go, you should have a ",(0,s.jsx)(n.code,{children:"hostcert.pem"})," and a ",(0,s.jsx)(n.code,{children:"hostkey.pem"})," file accessible for your development environment."]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-rucio-and-configuring-vscode",children:"Setting up Rucio and Configuring VSCode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Clone the rucio repository"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"gh repo clone rucio/rucio\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Clone the vscode configuration repository"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"gh repo clone maany/rucio-vscode-dev-env\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Move the vscode repo inside the rucio repo"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"mv rucio-vscode-dev-env rucio/.vscode\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Copy the SSL certificates to the ",(0,s.jsx)(n.code,{children:"rucio/.vscode/certs"})," directory"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open VSCode. If you are using a remote VM, open the VSCode instance connected to your remote VM."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Go to ",(0,s.jsx)(n.code,{children:"File"})," -> ",(0,s.jsx)(n.code,{children:"Open Folder"})," and select the ",(0,s.jsx)(n.code,{children:"rucio"})," folder"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Edit the rucio/.vscode/docker-compose.yml and change the ",(0,s.jsx)(n.code,{children:"RUCIO_HOST"})," environment variable for the rucio-dev container to ",(0,s.jsx)(n.code,{children:"http://localhost"})," if you are using a local development environment or to the fqdn and port of your remote VM if you are using a remote development environment.\n",(0,s.jsx)(n.img,{alt:"RUCIO_HOST",src:i(75253).A+"",width:"1092",height:"520"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add the default url for webui in ",(0,s.jsx)(n.code,{children:"rucio.cfg.template"}),", which is required to handle Cross Origin Requests (CORS) in the webui. Add the following line to the ",(0,s.jsx)(n.code,{children:"[webui]"})," section of ",(0,s.jsx)(n.code,{children:"rucio.cfg.template"}),":\n",(0,s.jsx)(n.code,{children:" urls = "})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If your server is running on a remote VM, but webui will be running locally, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If both the server and webui are running locally, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),". In this case, you can set the ",(0,s.jsx)(n.code,{children:"urls"})," to ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If both the server and webui are running on the same remote VM, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://:3000"}),". In this case, you can set the ",(0,s.jsx)(n.code,{children:"urls"})," to ",(0,s.jsx)(n.code,{children:"http://:3000"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"vscode-tasks",children:"VSCode Tasks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsx)(n.li,{children:"You should see a list of pre-configured tasks"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"tasks",src:i(46399).A+"",width:"599",height:"334"})}),"\n",(0,s.jsx)(n.p,{children:"These tasks are helpful utilities for your to quickly start/stop rucio containers and to setup different types of debuggers ( server, webui, pytest, clients, ...)."}),"\n",(0,s.jsx)(n.h3,{id:"starting-rucio",children:"Starting Rucio"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"start-rucio"})]}),"\n",(0,s.jsx)(n.li,{children:"This will start and initialize the rucio development environment. The first time you run this task, it will take a while to fetch and build the docker images. Subsequent runs will be much faster."}),"\n"]}),"\n",(0,s.jsx)("video",{width:"100%",controls:!0,children:(0,s.jsx)("source",{src:"/documentation/img/vscode/start_rucio_task.mp4"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["After the command has finished, you can run ",(0,s.jsx)(n.code,{children:"docker ps -a"})," to check if all the containers are up and running. You should see something like this:\n",(0,s.jsx)(n.img,{alt:"docker ps -a",src:i(49962).A+"",width:"1515",height:"453"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"stopping-rucio",children:"Stopping Rucio"}),"\n",(0,s.jsxs)(n.p,{children:["To take down all the containers, run the ",(0,s.jsx)(n.code,{children:"stop-rucio"})," task. This is equivalent to a ",(0,s.jsx)(n.code,{children:"docker-compose down"})," command."]}),"\n",(0,s.jsx)(n.h2,{id:"debugging-overview",children:"Debugging Overview"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server, webui, clients, etc."]}),"\n",(0,s.jsx)(n.p,{children:"The debugging process for Rucio in VSCode is broken down into 3 steps:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Start the process inside the ",(0,s.jsx)(n.code,{children:"rucio-dev"})," container that you want to debug"]}),"\n",(0,s.jsx)(n.li,{children:"Attach the debugger to the process"}),"\n",(0,s.jsx)(n.li,{children:"Insert breakpoints in the code and start debugging"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are done debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-server",children:"Debugging Rucio Server"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server:debug"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Attach the debugger to the rucio server by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Server: Debug"})," from the dropdown menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"attach to rucio-server",src:i(80759).A+"",width:"393",height:"514"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio server."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You can now set breakpoints in the rucio server code and debug the server."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["After you have finished debugging, you can detach the debugger from the rucio server by clicking on the ",(0,s.jsx)(n.code,{children:"Stop"})," button in the debug toolbar."]}),"\n",(0,s.jsxs)(n.p,{children:["**NOTE: ** After detaching the debugger, run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n",(0,s.jsx)("video",{width:"100%",controls:!0,children:(0,s.jsx)("source",{src:"/documentation/img/vscode/rucio-vscode-server-debug.mp4"})}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-webui",children:"Debugging Rucio WebUI"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio webui."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio webui, you will need to start the rucio server in non-debug mode and the rucio webui in debug mode."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-ui:debug"})]}),"\n",(0,s.jsxs)(n.li,{children:["Attach the debugger to the rucio webui by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"UI: Debug"})," from the dropdown menu."]}),"\n",(0,s.jsxs)(n.li,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio webui."]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",children:["Debugging Rucio CLI Clients ( ",(0,s.jsx)(n.code,{children:"rucio-admin"})," and ",(0,s.jsx)(n.code,{children:"rucio"}),")"]}),"\n",(0,s.jsx)(n.h4,{id:"debug-rucio-cli-client",children:"Debug rucio cli client"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio cli clients."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio cli clients, you will need to start the rucio server in non-debug mode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you need to start the ",(0,s.jsx)(n.code,{children:"rucio-cli:pre-debug"})," task to inject the debug configuration into the rucio cli clients."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-cli:pre-debug"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start the ",(0,s.jsx)(n.code,{children:"Rucio:CLI Debug"})," launch configuration by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Rucio:CLI Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio cli clients."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["After that, you should open a shell inside the ",(0,s.jsx)(n.code,{children:"rucio-dev"})," container"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"docker exec -it rucio-dev bash\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Insert breakpoints in the rucio cli clients code."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run a rucio cli command to trigger the breakpoint."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"rucio-cli:post-debug"})," task to remove the debug configuration from the rucio cli clients."]}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"debug-rucio-admin-client",children:"Debug rucio-admin client"}),"\n",(0,s.jsxs)(n.p,{children:["The instructions are the same as for the ",(0,s.jsx)(n.code,{children:"rucio"})," client, except that you need to start the ",(0,s.jsx)(n.code,{children:"rucio-admin:pre-debug"})," task to inject the debug configuration into the rucio-admin client."]}),"\n",(0,s.jsxs)(n.p,{children:["After debugging, you should run the ",(0,s.jsx)(n.code,{children:"rucio-admin:post-debug"})," task to remove the debug configuration from the rucio-admin client."]}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-tests",children:"Debugging Rucio Tests"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio tests."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio tests, you will need to start the rucio server in non-debug mode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Then, you should open the file containing the test you want to debug in VSCode."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Insert breakpoints in the test code."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start the ",(0,s.jsx)(n.code,{children:"rucio-pytest:debug"})," to start the test in debug mode"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Attach the debugger to the test by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Pytest: Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio tests."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},75253:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-compose-rucio-host-465a74fa33e82533f549c7342c5942e2.jpg"},49962:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-ps-7e66472c5b3eaab849aed2e0fe06e354.jpg"},67403:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/remote_ssh-b59c7e945ebcc026fee6dd82cfebe0ab.jpg"},76587:(e,n,i)=>{i.d(n,{A:()=>s});const s="data:image/jpeg;base64,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"},80759:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-server-debug-98c2ec8a56860d6718e4da5bf97bc709.jpeg"},46399:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-tasks-a9f11e37004c47a3ee27c6549b968aee.jpg"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>c});var s=i(96540);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f6484bf.bfd981e6.js b/assets/js/1f6484bf.bfd981e6.js new file mode 100644 index 0000000000..abc9b30356 --- /dev/null +++ b/assets/js/1f6484bf.bfd981e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5680],{47767:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=i(74848),t=i(28453);const o={id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},r=void 0,c={id:"developer/setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code",description:"Local Setup vs Remote Setup",source:"@site/../docs/developer/setting_up_vscode_dev_env.md",sourceDirName:"developer",slug:"/developer/setting_up_vscode_dev_env",permalink:"/documentation/developer/setting_up_vscode_dev_env",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/setting_up_vscode_dev_env.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"setting_up_vscode_dev_env",title:"Setting up a Rucio Developer environment using Visual Studio Code"},sidebar:"docs",previous:{title:"Setting up a Rucio Developer environment using IntelliJ Ultimate",permalink:"/documentation/developer/setting_up_intellij_dev_env"},next:{title:"Contributing Guide",permalink:"/documentation/contributing"}},d={},l=[{value:"Local Setup vs Remote Setup",id:"local-setup-vs-remote-setup",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"VSCode",id:"vscode",level:3},{value:"Remote Only: Additional Setup VSCode",id:"remote-only-additional-setup-vscode",level:3},{value:"VSCode Extensions",id:"vscode-extensions",level:3},{value:"Docker and Docker Compose",id:"docker-and-docker-compose",level:3},{value:"SSL Certificates",id:"ssl-certificates",level:3},{value:"Setting up Rucio and Configuring VSCode",id:"setting-up-rucio-and-configuring-vscode",level:2},{value:"VSCode Tasks",id:"vscode-tasks",level:2},{value:"Starting Rucio",id:"starting-rucio",level:3},{value:"Stopping Rucio",id:"stopping-rucio",level:3},{value:"Debugging Overview",id:"debugging-overview",level:2},{value:"Debugging Rucio Server",id:"debugging-rucio-server",level:3},{value:"Debugging Rucio WebUI",id:"debugging-rucio-webui",level:3},{value:"Debugging Rucio CLI Clients ( rucio-admin and rucio)",id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",level:3},{value:"Debug rucio cli client",id:"debug-rucio-cli-client",level:4},{value:"Debug rucio-admin client",id:"debug-rucio-admin-client",level:4},{value:"Debugging Rucio Tests",id:"debugging-rucio-tests",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"local-setup-vs-remote-setup",children:"Local Setup vs Remote Setup"}),"\n",(0,s.jsx)(n.p,{children:"It is possible to run the containers for rucio development locally or on a remote VM."}),"\n",(0,s.jsxs)(n.p,{children:["For local development machines with limited resources ",(0,s.jsx)(n.code,{children:"(<16 GB RAM, < 4 Cores)"}),", it is recommended to run the containers on a remote VM. This will allow you to use your local machine for other tasks while the containers are running on the remote VM."]}),"\n",(0,s.jsxs)(n.p,{children:["Local development has been tested only on Linux hosts.\nRemote development has been tested on Linux(for the remote VM) and Linux/MacOS(for the local instance of vscode).\nThe additional steps required for setting up a remote development environment are described in the sections begininng with ",(0,s.jsx)(n.code,{children:"Remote Only: "}),". These sections can be ignored if you are setting up a local development environment."]}),"\n",(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.h3,{id:"vscode",children:"VSCode"}),"\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/Download",children:"Visual Studio Code"})]}),"\n",(0,s.jsx)(n.h3,{id:"remote-only-additional-setup-vscode",children:"Remote Only: Additional Setup VSCode"}),"\n",(0,s.jsxs)(n.p,{children:["For development on a remote VM, you will need to install the ",(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack",children:"Remote Development Extension Pack"})]}),"\n",(0,s.jsxs)(n.p,{children:["You should setup SSH access to your remote VM. For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Remote-SSH: Open SSH Configuration File"}),"\n",(0,s.jsx)(n.img,{alt:"Open SSH Configuration File",src:i(67403).A+"",width:"609",height:"270"})]}),"\n",(0,s.jsxs)(n.p,{children:["You will be asked to create a new SSH configuration file or select an existing one. If you have an existing SSH configuration file, select it. If you do not have an existing SSH configuration file, select ",(0,s.jsx)(n.code,{children:"Create New File"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Update the SSH configuration file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host \n HostName \n User \n"})}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, you can use the ",(0,s.jsx)(n.code,{children:"IdentityFile"})," option to specify the SSH key to use for authentication. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host \n HostName \n User \n IdentityFile ~/.ssh/\n"})}),"\n",(0,s.jsx)(n.p,{children:"If your remote VM is behind a firewall, you will need to setup a proxy. For example, at CERN, we can use lxplus as a ssh proxy to connect to the remote VMs, which are not accessible outside the CERN network. The following is an example of an SSH configuration file that uses lxplus as a proxy:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Host lxplus\n HostName lxplus.cern.ch\n User \n\nHost \n HostName \n User \n ProxyCommand ssh -q -W %h:%p lxplus\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/ssh",children:"Connecting to a remote host"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Test connection to Remote VM"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Remote-SSH: Connect to Host..."})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select the remote VM from the list of hosts"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Depending on your SSH Configuration, you may be prompted for the password/s in the following order:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"remote user on the proxy host"}),"\n",(0,s.jsx)(n.li,{children:"ssh key password or the password of the remote VMs user."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The bottom right corner of VS Code will show the status of the connection. If the connection is successful, you will see ",(0,s.jsx)(n.code,{children:"SSH: "})," in the bottom right corner:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Successful Connection",src:i(76587).A+"",width:"354",height:"108"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["For troubleshooting and Tips/Tricks, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/remote/troubleshooting",children:"Troubleshooting"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"NOTE for remote development"}),": From hereon out, all the instructions should be run in the VSCode instance connected to your remote VM. ( i.e. the VSCode instance that shows ",(0,s.jsx)(n.code,{children:"SSH: "})," in the bottom right corner)\nYou can use the terminal in the VSCode instance to run commands on the remote VM directly. To do so, open the terminal in VSCode instance connected to your remote VM by clicking on ",(0,s.jsx)(n.code,{children:"Terminal"})," in the menu bar and then clicking on ",(0,s.jsx)(n.code,{children:"New Terminal"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"vscode-extensions",children:"VSCode Extensions"}),"\n",(0,s.jsx)(n.p,{children:"Install the following extensions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.python",children:"Python"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance",children:"Pylance"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker",children:"Docker"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"Remote - Containers"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["VSCode comes with a plethora of extensions that can significantly improve your development experience. For more information, see ",(0,s.jsx)(n.a,{href:"https://code.visualstudio.com/docs/editor/extension-gallery",children:"Extensions"})]}),"\n",(0,s.jsx)(n.h3,{id:"docker-and-docker-compose",children:"Docker and Docker Compose"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})]}),"\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"ssl-certificates",children:"SSL Certificates"}),"\n",(0,s.jsxs)(n.p,{children:["If you would like to debug the rucio webui and x509 authentication capabilities of the rucio server, you will need to obtain SSL certificates for your development environment. For remote VMs, you can request them from your IT department or you can use letsencrypt to generate a certificate. For local development machines, you can use ",(0,s.jsx)(n.a,{href:"https://github.com/FiloSottile/mkcert",children:"mkcert"})," to generate a certificate."]}),"\n",(0,s.jsxs)(n.p,{children:["Whatever route you go, you should have a ",(0,s.jsx)(n.code,{children:"hostcert.pem"})," and a ",(0,s.jsx)(n.code,{children:"hostkey.pem"})," file accessible for your development environment."]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-rucio-and-configuring-vscode",children:"Setting up Rucio and Configuring VSCode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Clone the rucio repository"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"gh repo clone rucio/rucio\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Clone the vscode configuration repository"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"gh repo clone maany/rucio-vscode-dev-env\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Move the vscode repo inside the rucio repo"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"mv rucio-vscode-dev-env rucio/.vscode\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Copy the SSL certificates to the ",(0,s.jsx)(n.code,{children:"rucio/.vscode/certs"})," directory"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open VSCode. If you are using a remote VM, open the VSCode instance connected to your remote VM."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Go to ",(0,s.jsx)(n.code,{children:"File"})," -> ",(0,s.jsx)(n.code,{children:"Open Folder"})," and select the ",(0,s.jsx)(n.code,{children:"rucio"})," folder"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Edit the rucio/.vscode/docker-compose.yml and change the ",(0,s.jsx)(n.code,{children:"RUCIO_HOST"})," environment variable for the rucio-dev container to ",(0,s.jsx)(n.code,{children:"http://localhost"})," if you are using a local development environment or to the fqdn and port of your remote VM if you are using a remote development environment.\n",(0,s.jsx)(n.img,{alt:"RUCIO_HOST",src:i(75253).A+"",width:"1092",height:"520"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add the default url for webui in ",(0,s.jsx)(n.code,{children:"rucio.cfg.template"}),", which is required to handle Cross Origin Requests (CORS) in the webui. Add the following line to the ",(0,s.jsx)(n.code,{children:"[webui]"})," section of ",(0,s.jsx)(n.code,{children:"rucio.cfg.template"}),":\n",(0,s.jsx)(n.code,{children:" urls = "})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If your server is running on a remote VM, but webui will be running locally, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If both the server and webui are running locally, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),". In this case, you can set the ",(0,s.jsx)(n.code,{children:"urls"})," to ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If both the server and webui are running on the same remote VM, then the requests originating from webui to the server will have the origin ",(0,s.jsx)(n.code,{children:"http://:3000"}),". In this case, you can set the ",(0,s.jsx)(n.code,{children:"urls"})," to ",(0,s.jsx)(n.code,{children:"http://:3000"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"vscode-tasks",children:"VSCode Tasks"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsx)(n.li,{children:"You should see a list of pre-configured tasks"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"tasks",src:i(46399).A+"",width:"599",height:"334"})}),"\n",(0,s.jsx)(n.p,{children:"These tasks are helpful utilities for your to quickly start/stop rucio containers and to setup different types of debuggers ( server, webui, pytest, clients, ...)."}),"\n",(0,s.jsx)(n.h3,{id:"starting-rucio",children:"Starting Rucio"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"start-rucio"})]}),"\n",(0,s.jsx)(n.li,{children:"This will start and initialize the rucio development environment. The first time you run this task, it will take a while to fetch and build the docker images. Subsequent runs will be much faster."}),"\n"]}),"\n",(0,s.jsx)("video",{width:"100%",controls:!0,children:(0,s.jsx)("source",{src:"/documentation/img/vscode/start_rucio_task.mp4"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["After the command has finished, you can run ",(0,s.jsx)(n.code,{children:"docker ps -a"})," to check if all the containers are up and running. You should see something like this:\n",(0,s.jsx)(n.img,{alt:"docker ps -a",src:i(49962).A+"",width:"1515",height:"453"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"stopping-rucio",children:"Stopping Rucio"}),"\n",(0,s.jsxs)(n.p,{children:["To take down all the containers, run the ",(0,s.jsx)(n.code,{children:"stop-rucio"})," task. This is equivalent to a ",(0,s.jsx)(n.code,{children:"docker-compose down"})," command."]}),"\n",(0,s.jsx)(n.h2,{id:"debugging-overview",children:"Debugging Overview"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server, webui, clients, etc."]}),"\n",(0,s.jsx)(n.p,{children:"The debugging process for Rucio in VSCode is broken down into 3 steps:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Start the process inside the ",(0,s.jsx)(n.code,{children:"rucio-dev"})," container that you want to debug"]}),"\n",(0,s.jsx)(n.li,{children:"Attach the debugger to the process"}),"\n",(0,s.jsx)(n.li,{children:"Insert breakpoints in the code and start debugging"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are done debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-server",children:"Debugging Rucio Server"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio server."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server:debug"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Attach the debugger to the rucio server by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Server: Debug"})," from the dropdown menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"attach to rucio-server",src:i(80759).A+"",width:"393",height:"514"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio server."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You can now set breakpoints in the rucio server code and debug the server."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["After you have finished debugging, you can detach the debugger from the rucio server by clicking on the ",(0,s.jsx)(n.code,{children:"Stop"})," button in the debug toolbar."]}),"\n",(0,s.jsxs)(n.p,{children:["**NOTE: ** After detaching the debugger, run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n",(0,s.jsx)("video",{width:"100%",controls:!0,children:(0,s.jsx)("source",{src:"/documentation/img/vscode/rucio-vscode-server-debug.mp4"})}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-webui",children:"Debugging Rucio WebUI"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio webui."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio webui, you will need to start the rucio server in non-debug mode and the rucio webui in debug mode."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-ui:debug"})]}),"\n",(0,s.jsxs)(n.li,{children:["Attach the debugger to the rucio webui by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"UI: Debug"})," from the dropdown menu."]}),"\n",(0,s.jsxs)(n.li,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio webui."]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"debugging-rucio-cli-clients--rucio-admin-and-rucio",children:["Debugging Rucio CLI Clients ( ",(0,s.jsx)(n.code,{children:"rucio-admin"})," and ",(0,s.jsx)(n.code,{children:"rucio"}),")"]}),"\n",(0,s.jsx)(n.h4,{id:"debug-rucio-cli-client",children:"Debug rucio cli client"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio cli clients."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio cli clients, you will need to start the rucio server in non-debug mode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you need to start the ",(0,s.jsx)(n.code,{children:"rucio-cli:pre-debug"})," task to inject the debug configuration into the rucio cli clients."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-cli:pre-debug"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start the ",(0,s.jsx)(n.code,{children:"Rucio:CLI Debug"})," launch configuration by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Rucio:CLI Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio cli clients."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["After that, you should open a shell inside the ",(0,s.jsx)(n.code,{children:"rucio-dev"})," container"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"docker exec -it rucio-dev bash\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Insert breakpoints in the rucio cli clients code."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run a rucio cli command to trigger the breakpoint."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"rucio-cli:post-debug"})," task to remove the debug configuration from the rucio cli clients."]}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"debug-rucio-admin-client",children:"Debug rucio-admin client"}),"\n",(0,s.jsxs)(n.p,{children:["The instructions are the same as for the ",(0,s.jsx)(n.code,{children:"rucio"})," client, except that you need to start the ",(0,s.jsx)(n.code,{children:"rucio-admin:pre-debug"})," task to inject the debug configuration into the rucio-admin client."]}),"\n",(0,s.jsxs)(n.p,{children:["After debugging, you should run the ",(0,s.jsx)(n.code,{children:"rucio-admin:post-debug"})," task to remove the debug configuration from the rucio-admin client."]}),"\n",(0,s.jsx)(n.h3,{id:"debugging-rucio-tests",children:"Debugging Rucio Tests"}),"\n",(0,s.jsxs)(n.p,{children:["After you have run the ",(0,s.jsx)(n.code,{children:"start-rucio"})," task, you can start debugging the rucio tests."]}),"\n",(0,s.jsx)(n.p,{children:"To debug the rucio tests, you will need to start the rucio server in non-debug mode"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open the Command Palette (Ctrl+Shift+P)"}),"\n",(0,s.jsxs)(n.li,{children:["Run the command ",(0,s.jsx)(n.code,{children:"Tasks: Run Task"})]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.code,{children:"rucio-server"})," to start a rucio-server in non-debug mode"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Then, you should open the file containing the test you want to debug in VSCode."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Insert breakpoints in the test code."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start the ",(0,s.jsx)(n.code,{children:"rucio-pytest:debug"})," to start the test in debug mode"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Attach the debugger to the test by clicking on the ",(0,s.jsx)(n.code,{children:"Debug"})," icon in the left sidebar and selecting ",(0,s.jsx)(n.code,{children:"Pytest: Debug"})," from the dropdown menu."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Press ",(0,s.jsx)(n.code,{children:"F5"})," to start debugging the rucio tests."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After you are finished debugging, you should remember to"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"detach the debugger from the debug process"}),"\n",(0,s.jsxs)(n.li,{children:["run the ",(0,s.jsx)(n.code,{children:"cleanup"})," task to remove all processes inside the container that were used for debugging."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},75253:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-compose-rucio-host-465a74fa33e82533f549c7342c5942e2.jpg"},49962:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/docker-ps-7e66472c5b3eaab849aed2e0fe06e354.jpg"},67403:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/remote_ssh-b59c7e945ebcc026fee6dd82cfebe0ab.jpg"},76587:(e,n,i)=>{i.d(n,{A:()=>s});const s="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAWIAAABsCAYAAABQIbi+AAAAAXNSR0IArs4c6QAAH3dJREFUeF7tnQ1UVWW6gJ/Gw4+KQB3/TopgIKZIJsfRQA3FxFKupU465hrF8ZqOS6Ep5TYTeLth5UWnBmt5/ZkmdFLT/BsHKRlRUQN1Oo4GaP4lioUplAoSf83c9W1+PCDIYXNU1Hev5Vpy2N93vu/Zm2e/5/3evc8DRqPx315eXtzN26VLl+7m4cvYhYAQuM8JPCAivs/PAJm+EBACd5yA/UXsYsTzYS8eNrnQxqkNjo6VcywtpaCkgMLcb8n+9iz5hfabu0TE9mMpPQkBIXD7CdhPxC4mevn74mVsUzGL0gLy8wsppYQSnHDCERejkTaVYi7Iz+ZERia5dhCyiPj2nzjyjkJACNiPgF1E7OJpJsjfhCOl5Gcf50T2TSJeFTF7+dLdy6jtn5uRhuVs02wsIrbfCSE9CQEhcPsJNFnExl7BBHq1gYJsLJZGRLgqgjabqWiaTmpmvu7Zi4h1o5OGQkAINAMCTRKxi2cgg/2NlOZmkGY5i3Vc62g04eX1MEZHFy3yLSzI59vsbHILS62m7YKnOQh/kyP5GbtJ1xkZi4ibwZkkQxACQkA3Af0idvEleLAvbQpOsDv1hJWEXTCZzZhNlblilS4GqtbsCrItpGfmaq9VbC74Bg/Gt00BJ3anckJHlkJErPv4S0MhIASaAQGdInbEMzAUf2MBGbtTsQ5kr6cqcsnIzOBsfoVyHY2e+PfyR/n5hlSEiyfBg/1pk59BcvpZK0nbRkhEbBsn2UsICIHmSUCfiF16ETzYC6fsdJKtc7vVUXI26amZ3Jj1NdIrOBCvOqJfY69QAr1KdEXFIuLmeXLJqISAELCNgC4Ru/QKZrAXN0jTpVcog70cybUkYsmtZwAmM2FmEwXZu0nNtMpDVEqc2q/bMA8RsQ2QZBchIASaLQEdInbENzgUX2rnhsEUGIbZmE9GcjpnrdfkrKfv6ElgqD/GXAuJNWztQq/gwXiRQXJq49ITIuJme37JwISAELCBgA4RGzGHBmLKry1SMJnDMJsKOJGcyombiDg41B+n3HSSLTWTF1p7Yy7pyZY60hr1z0ZEbMORll2EgBBotgR0iNhEYJiZNrXzw2pBzjOYUP82FGTsJrWeUjQXz2AGa/skk1orbK7IExdgSUynvsxGXSRFxM32/JKBCQEhYAMBXSI2h5kx1iFiHE2YQ82YqKcUrWoxj3wsyenk1oqaK0ScjyXRIiK24eDJLkJACNwbBHSIuP7UhELiaDIz2Fx1u3MG2bkFFNAGo8nr+m3Nlt1YaluYytSGpCbujTNLZiEEhIDNBHSI2BHP4FD8yWZ3amaNu+mq3tVoDiXQVHULR82xlOZa2G2xvqGj6veyWGfzUZMdhYAQuKcI6BAxuPgGM9j3xvI1MOIbaMbXWCHhgoJ8CitvaXZ0MWKsfvRaNpb0zJqpiarytRO7SW3k7XWSI76nzkmZjBC47wjoEjGV0qxZ+VB1swaU5p7AknGCypvqrkN1NOLp3wt/dXtdaS6W3ZZqGddXm2zLERER20JJ9hECQqC5EtAnYhwxmUMrStW050OonwdjNjlqty+nZ+bf9Dblioi6DVTd0uziSeDgitri5DrTFjfHJyJurqeXjEsICAFbCOgUsXpWT+XzIQpOkJ4JvQLregBQfUOoelZFKdnpaZT2qnjoT+3nVtgyAbWPiNhWUrKfEBACzZGAfhFrLg4kyF894F1tpeRakuu/tbn27I1mQgNVdUXFJo/BbI6nh4xJCAiB20GgSSJWA6xOM1BAdnoqNj/fvbqmWB4MfzsOtLyHEBACzZdAk0Wsydhkxmw20YZSCnKzOXH8RP3fRVfjq5IKyM2wyFclNd/zQ0YmBITAbSBgFxFr43Q04uvfC9+qB8I39OWhuSfIrKuyQsekJUesA5o0EQJCoNkQsJ+Iq6akIt6HvWhrcsHo1AbHqiRwaSkFJfkU5uaR/e1NvlxUBxoRsQ5o0kQICIFmQ8D+Ir4DUxMR3wHo8pZCQAjYjYCI2G4opSMhIASEgD4CImJ93KSVEBACQsBuBETEdkMpHQkBISAE9BEQEevjJq2EgBAQAnYjICK2G0rpSAgIASGgj4CIWB83aSUEhIAQsBsBEbHdUEpHQkAICAF9BETE+rhJKyEgBISA3QiIiO2GUjoSAkJACOgjICLWx01aCQEhIATsRkBEbDeU0pEQEAJCQB8BEbE+btJKCAgBIWA3AiJiu6GUjoSAEBAC+giIiPVxk1ZCQAgIAbsREBHbDaV0JASEgBDQR0BErI+btBICQkAI2I2AiNhuKKUjISAEhIA+AiJifdyklRAQAkLAbgRExHZDKR0JASEgBPQREBHr4yathIAQEAJ2IyAithtK6UgICAEhoI+AiFgfN2klBISAELAbARGx3VBKR0JACAgBfQRumYh9fHzw9/evMaozZ85w+PBhfSO9SatLly7ZvU/pUAgIASFwuwjYTcQODg6UlZVVj7tfv3506tSJH374gX/961+4u7tz9epVdu/eXb2PwWCgvLy8yXMVETcZoXQgBITAHSRgFxE/+uijqAj4yJEj5OTkaNN5+umnUXL+29/+pv08YMAA2rVrx9atWzUxm0wm+vTpw7lz58jMzGwSAhFxk/BJYyEgBO4wgSaLuHv37vTs2bN6Grm5uRw9epShQ4eSl5fH3r17td/5+fnh6+vLvn378PDwwNPTs7rNyZMnmyRjEfEdPovk7YWAEGgSgSaJuFu3bvTq1Ysff/yRAwcO4O3trUlWRbw/+9nPsBasSlOodEXV71TKQuWLVVSs0hYnTpwgKytL12RExLqwSSMhIASaCQHdIlaiDQ0NpWXLlqSnp3PhwgVtSirl8Pjjj+Pk5MT+/furX1f7DRs2TBP0V199pf1Tm6urqxY9q/zy9u3ba+SZbWUkIraVlOwnBIRAcySgW8RqMh07diQwMFBbkLNehFO5YfWvqKioxpzV4pyzszOFhYXVr1ct6v3jH//g/PnzuhiJiHVhk0ZCQAg0EwJNErGag9lspkuXLhw7dqw6yrV1blUi//bbb7XUht5NRKyXnLQTAkKgORBosohVfjc4OJgHHniAXbt2ceXKlep5qai4Q4cO2s9q4a64uLj6dyo6fuqpp7QIWUXTly9f1s1DRKwbnTQUAkKgGRDQJWJVrvbggw/y0EMP4ejoWD2NHTt2UFBQoP2sStWeeOIJlHDV9tNPP2nlbWfPntV+VuJWJW5KxGorKSnRUhzqX1X+2FY+ImJbScl+QkAINEcCukQ8evRobS4qwlXizM/P1/59//332ustWrTQJFu1MKdu2lDyVtJOSUmpzhG7uLhowjYajZrUW7durbXfvHlzo1iJiBuFS3YWAkKgmRHQLWIV+aoIuK6tbdu2DBo0SKsNViVsauvcuTM///nPtaj466+/rrOdiqBV1YWIuJmdJTIcISAEbimBWypiVRes6oNFxLf0GErnQkAI3OUEdIv43//+t5YPVqkJtdBWld+tSk0MHz5cS00oEZeWltKjRw8tNfH3v/+9uqxNpSZUWkLlm9Win5ubm9ZGIuK7/KyS4QsBIdAoArpErKSq5Kn+1bdYp6olVCpCVU6oTd1RZ7FYqmuFay/WqRs6lMxVnlmVwjVmkxxxY2jJvkJACDQ3ArpEbD2Jm5WvKUm3b99e2/3ixYtaZFy1WZevqedRqMU+vZuIWC85aScEhEBzINBkEcsNHc3hMMoYhIAQuJsJNEnEN7vFWUW86mFA1pt6TT2D4tq1a9Uvyy3Od/PpI2MXAkLAHgR0i7i+h/4oOasnqtX10B/1cB9VY6xu2Dh+/Lg2fnnojz0Oo/QhBITA3UxAt4jVpGs/BvORRx7RnjuhKirUYlxdj8Gs+l3tx2AqMavnGOvZJEesh5q0EQJCoLkQaJKI1STqejC8qnoICQmp88Hwn3/+ufYVSl5eXtUMVITc2EoJa4Ai4uZyOsk4hIAQ0EOgySJWb1r1VUkZGRnVz5Jo6KuSVDVFQEAA2dnZjX62RO2Jioj1HHppIwSEQHMhYBcRq8no+fJQlWdW9cVN3UTETSUo7YWAELiTBOwm4tqTUF8m6u/vX+PlM2fOaF+PZO9NRGxvotKfEBACt5PALRPx7ZyEiPh20pb3EgJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUBE3EhgsrsQEAJCwN4ERMT2Jir9CQEhIAQaSUATcYvIEY1sJrsLgXuHwJgPPe6dychM7koCIuK78rDJoO1JQERsT5rSlx4CImI91KTNPUVARHxPHc67cjIi4rvysMmg7UlARGxPmtKXHgIiYj3U9LRp0QoPZ8i5VqSntbS5CQFXt7Y4FeZx6Sd9mPSJ2EDLTi60pJir3xRTru+tbWpleKQrvk65HD1WbNP+t34nZx7qBN9/U994DLh2MmhcZLONgP1F3DqAuHGDyNwUz6ortg2iOe/V7rFIdg64wvTlCaTp/EMHB4JGLCCh9Wr8PzlESXOe8N02ttahbIp4gl1L3uA9nedbY0Rs6NSNJyOfZNATD+JQUk5RCbi2M/BdahqJcWmczLM3wI6EJs4gzOkg745M4kypvftvfH8PjZ3My2NP8l54Gt/VNZ62/kzf1I+T4R+w8+vG938/trCviDUJh0FaPFHH6/mrcPJm2qhwInw8aW8o5WLeaZYnLeK9s2V49Awnfmh/zO6tofgSp46vJ3zrAVxDFpDUaTt9/7KLS5VHycl7Gl+McmDu4iV8pluQDR9ypw4DifYuYnnaIXIa3r2ePUTEutE11PA2irhl/1Bmze/Kd0uT2LIxh6tVY3NsS+/IkTz/HwZ2Rqxk5+G64mMDHcY+y9Qofzq6FpOz4a98EHOM7xuYn2vYRH4bdpLtJUEEHkjg3TWXGyKC4fEgpi4Mwa8zXP3nQVZOT+ZkQYPNbNvBsSsTtoWSPzcZ15ggvpu+mr1WFx9D/1HMfiGHLYcDmPp4Gm9GHuPHGj270zt6PM9PNOF6NY8v4j5mzca8W/qJwraJ3dm97CdiWyQMBIQuYHP3XGK2biat0AGPTiY4u49dxQNZGzERtyMJRFvOUeJiwtw6j3VHz+FzB0Vsn8MjIrYPxzp6uV0i7tSPWWv7cD7iA7bUKVp4KGwiL0cVs2bkRo7WFt8jTzJ3Uz++j11H4nkPnl8cAnF/5P2NhfWjcezKLzaFUj53GVtKgvjtMhPbx9TRt3UPjh78YttU/Pav44M15fSdP54nzm/kf24Qor4jokT7WuQFlm7sxuxhXxI3I4OWw0IZPgyylu7E8nVbnkt8FqIP0mGxL/ufWscRq6jZdexk/jsKtkVs40znoUyNcWfPmGUk3+eRsz4RuwUwqeM5Vh2vvBS28Oa1SeG4pS2qPxLWjrsDzz3/f8T+tIS+m2p9RO8wjn2/fpR1dXzE9GtAxLs6h5MyzptP18Tw5jfXTzCnTiNJGDWcIHd3nDnL4tWrcXt2Jq7JrzDjeBm0CGDpy+O4uiaGqG/KoPWjzB4Rzos+D+NafolPt79BZHk4GcF5/PL/VnMIB/weC2ehitqdyzh3fh8xW1fzWV3BfwsT40dOI9rPR+srp9iN9heWVKQmWph4bng4r/l5054rWCwJTN+ZgVtQLCl++xm6YhunACfPcPaNc+PNd1bj9Owc5ni3pYuzI8WXj7HleB7dugfg5+7A1fP7mLs+gc+uqUb9WfpiOM+oTxWFZ/k0dQWRh85RgolJE35HtJc7blzGkrWa6VsPkENbxo+x6lu1SVlCZJaJ+IhpkBRRwQoTr02LxWx5hTGHrCfsgM9j4SwODsDs7sDFC8lM/vN6Djn789qoifzSqy2uxedYt30JUUfzwMmf2BfCea5jO9obrvH59hgmfBfC5lED8XNRx+ka587vImrTenap+dTY2vJ06DRie3vTxVDGySMrGJralrUR4+hWXIariwMleRks3LqEFep42rg1nJow0DPuJUZ+/RELl+bRYZg/xqP/5GjluWZ43J++nGT/YQPmpbMIOfwnbT/rrcOMWbw27EteH7tHi4I7R79EVM80ol84eD2yrjXeh6ZMZfbjacRpEjXQLXYWz139mIULL9Q7MyXK15c9SOKglewvAMOTY5m/2JlP+q3GYoe0Rsuxk4l6PI01jCTs2J94d4MHU3c8SVkq+Lru4fXIk3SNncXww3/lwpQQvlfpiWoULgxaM4eQox/wP/PV50t3Qja+xBP73+ethXbP6dh49JvHbvpE7PQor42biIclnhnqj0v7I5/JM6cTCD94+qY5UI+AOaQMN5GWupqFlkNkVSVMWzxK3ItzeK54H/N3JrLubF51Pw2J+DP3ISwN9eGzpBVssXKEU89IMoaWEbVmPRYcKC5wY+70+kTcivHPxxLrso+IpL2cwg2n4q841SmyWsRZnSaSMimAzG1LWPSNA0NCZzLXOZERHyZr4rTe/EJiSfLLY/7W9ewqNzE5dBrjC1doIvYImkeS+QrzN60mzXk4y8YEkLn+VSLLx7Fvkonlixex6hr4qD467GTA2tO8+Jt5mI/EEJnlgDl4JvHdr7BoUwJbLpuYPW4mQaffZmDyacANv06tuHi5jG69p5EwoIioxfFsKXHAo0MXbVGrpGMYCeP6k7n+FSJPm3jtN/MYcOQNpmeV4eEXzrIBZcxfsoSSEX/gtZJ4Bm79ihKnIax9OYTMP8fw5nfWF7tKJttXsOj0FVxd4NQ3RTwzYQHRbGZ68iHoPo1lA4qIUeMwqJxuCKfWx6P+9tzKc8nxVMepiKg1m8l09mb2qGmYT7/N0OSa55JPv3kkDSjiva3r2XLZAQ9DHmmF/bX+cjYtYVGeA0HBM4lz28nQDysuZrZsDYrYsQdTdwRxYswH7M1TKYbxzJhSzJbwjWS1C2LGMn8uzF3JhgPFmvhej7rEe2F7uI7JQO/4V5nERv4r8pj2MdwwdjLvRP7Ae09t5WRdgmzTg0mbgjg/fSU5U2Yx2Wk7r8c5M2NtT76YsJr99Xir5QtT+d8Zl3j3qa0V+eROQczdEcDJke+zxQ5RpyFsIq8/eYgPLg1lAht4a2ExoRtfYnQf+Dr2jyz8sJDe8bPo+/dtFEUGcX7MSvZWfTpQaY0dkzHGL+D9jWohT13g5jDVdRv/NSPjvk5P6BOxOrtry7hFFyaNm8ZzZxMITztd71UeWuH32GiiBwwkyL0Ii2U9USkHOKXyvG7+zB46mkndu+CWd4iFyQmsOFuEEvHOAQ9TXG59xjriXL6fye/UnyPWRFwdzQJK9jPrEfHlgWyKGE7WqleJsY6qq/tYj7NacHPbTN+1+yrmZxxJyotPsGX521wJXcxCH0fgGpvXv0XOk//NgKxXGZGm/mKsUxO5zJkWa/W7VoyfsJjZ+W8wMKUVcTMjaZ/yCuFHWzHtV7E8czyGMQdbabLs9flvmPBlGU7qgvBCWxa9E8+WnyrTPcZEfNfuq3kRdBrI2peHk7k8hjfzrZVkYvaUWIYciWDMobY1+q74lDCRkvWvEtN6Jl8MvUL4kgQsPjP5IrSI6UusFy0r52XNRL1N6yE1Wao+I8Ip2foKkRfU72ourtU+Tj7qk4H3zhprAupiP3taLM9UM62cT63UxPVPERVsbNkaFHGPUH6/0MDasCTOaB0a6PzCRGZMMXDFqSXnoxNYu6cyxdCmH7/d0ZWdg6w/khswfxjN6EsreT3qTIWIwybyvzHlrKqx3/XRdp47SxPUmzE5dI19Sft/dOQxOla/XtFP7e2hKdN5/YUzxA1L5rz6pRrPwSByJvyRDYdtodHAPirFstiFDdEwaXFLtkzPYVBCHy5sKOdx74PExT/I1GUm9kT8QMh8AxuqmQGO3Zi0dzwtYxewLFGjQLfYl5jdOYWXp/xTRKz7FmfdMlYH2wEP71DiR42mfVat6MepC+OHzySuex5RSxaR2X8BSZ6HmJC0n+qAt9NoPg4uu+liXaNEXD6alF978/Hit1lh9ZH4eh/r6fL84usRoppCi/4kvDyOi+tfZX5hF3yc1YtlXPqhFXOmRuKWEkH4UfUR2UrEm4qIm/l7fule84Q/d2ShFnkGjVrAYsNq+m53Y+3MQXy6/A1WXOlSU5bGcaS86M3Kd95mVQlUicv/L7soMQ4kbtRonunohlN5GTjnsVyJ+LI300aG86K3ifaGMkpwIHO7SjO41RKx1cUqO4CEmeO4uOlVtvgtIN6QwMCtGVayV6mmWkzUtDqo8YXRq8YUr/HpxgjCzzYsYteA35HR+0sGfrjt+gKpdhFVF6kqpnWLGI1NF5bHLWKdvURcKR8lYk1uSiGP9GPG2hF0vXqIpWO2Xl8M00TcjZ2DVlvlRhsZEbftw/S1PTmiRb4VsqoScXmbHkzdFMQZ9ZHfKmCoQn2rI2KVThi05j/pvfEjtmPC2GMAz3X+nLfmljNhRxBnIvZw1fUHysJ+ScixilRO9SYRcb1XOf0RcVWXbqFsmuTD8iWVkamKjJ8dTknKCtY1WE7kQMCIBWzusJ2BHybXrErQojkluVdY7hmrq2riBhHThdjfzMPn8wgmfFlUM0fcpIg4hvdqRZwqnxqSFcPQtNxaEXEec6bNqyPXWgFUi+jGtGLR527Edrcw9C+KS0MinkeK9178/3KAZyb8gTnlq5mwdR+nUAugw8lcFcMqz3nsM+cyfU0Cn11xY/aUBQw50oCIj6OV3S1z3smnHYbjlKxSGda515tFxCFYaqUxtAnWsbhW+zjVKWLFYNo8q08St1HENVIT6uN+H6YmBFMW9xF7vZ9l6rAcVoZXVCZoi1kxxSwNS7ZKTUBVjvjNsRUpi/pzxBW54OevfsxblbngDmGhDHL6kg0bK3LDHaZMZUZ17rjm37aWI054kMR+tyZHXHERCmJyZDmJ0T8wfMdEelOMdlY4OVP+t5W8Hu/M8/PbsT9iT61yu+s54jfn51AuOeLqg9c0EWsR8TjaW5YQqeWKG9ocCHgslF4lp7HkXQEXtTg2kQHfLaFvCkzya8Wps6fJKW6FT+9xLO7fiveWx7CzdwPla5U54l1JNeV/o4gdeHrMH1jsdoCIpO1k4U/cpOHkaIt1bkyaEEu08z4ikreTVexGO3LJ6jCtVo7Yn8xtKxrMEVfkM8tYmbSaVRfKMA/9HXEtErQcsZb71fLHm/nschGu7m5cVfPW8HkT+5s5jHeBzJRXKxfGGiPixcwpTyA86RCnUBFtLRGvX03aZTcmT1KpiYZEXFYR3f46FJ/iA4QvXsGun9DKDOP8vmX+J8mcUheOF/zJ2r6C+afzcHJvxdWzRQz5VSxzSWRu8gGyilvh4VKG5ZtcShol4l34hMzkxeJEwtO+0iL/pP5XWKRyxHlltHMpI+tyAGutUx23IiLGWct7jjz/EXEL8+gaPZHAw39lVaIqJXOm29zxhHzzV5atKdb2Cz2WcMNiHSqq3taP76PXkXjag+eX1VM18YiqjvBg55h1HKnMrXYIG0GI0yHWVooYrYRsJD9GvM+WY7X+5qyrJj4sp+9C+1ZNWL+b6wuT+f3YM7xbeXFBjT2hG+ljVtabw76hamK+O3tGStWEfhG39id23DhcD8TbKGF1CN0YEqIqCbzxcW+Nc/llMk/tY37Sena5DGHpiDAGdHSjvQGuXD7Hp6kJRH3ZcPnars4TSRn36I1VE7VzxNoQ+hM3ZiLjO7vjXH6Ni5e/YuH6eFapiLZ1xUr/ZK+HKyoLUuMZfTms7qoJlzLOZd+kagK1wh9OdO9H6aYqHYovYbGsYMLOr2pUTXRxVnM9RNSfl7ClMiWipRoG5BGpLbKpQdsq4l2UdApl2ajRDGmr+JZypTCD+aviWVWsLprTmNy5HW4G9XpeRVXI0do54lp5dNyY9Ks/MDv/bQYmVSye+QXNY7OKrpcoMTvgFxDOwuD+mF0q57J8CVsM1iyvcS57PRPW7uJUo0R8gCETYplbnkDIJwe4ZFVtorhdPLWaEVsdiL/lIgZNMmv7cWHun67ng2s58KGw8cyO/JFPxmy9sXyN63XEHq7FfF1nHbES/gxCDn/Eux9eD2xa9uhGV3Vn3eHrpW5KaFFa+dg/b1iPqa4j9jZwdX8aayKSsSlOaiiOqvH7jjyXOINBTjmcOV+VrTZg7ONB2eql1dH8jV260zt2PBN+0YVWV3M5EvcxK6WOGH0irpRwuwNVVRONOoKy811BoBWuTuDWeTTLRnXh4z+/fU/cKVkX+gYX6yobuQ4bxaz5vlzdsI1P4o9dv6us6oaO0HK2R6xj7zGdNzyrFMje8fQsKax1E0Rdozbg6prLmsoytdt9SlVUh/zIJ9EZNS8Erj34RUwbtqlaajuUy93ued2p99MnYrcAxnc8x7qqOuI7NXp531tHwDiSpBfH41d86noN8K17tzvas60irsiP+hMWFUzfPs6UXSqgiJa4ucKF1DS2xR/kjC0ZugZma3A02MSjvFSn8G3q/eY7uQ57kidKDpK8p/bzJJzpOeVJHJKTOVLHYqId3vqe7EKfiO9JFDKp+5VAY0RczcjRGdd2LhhKCrmad2sf+nO/Hpf7ad4i4vvpaMtc6ySgS8TCUgjYkYCI2I4wpau7k4CI+O48bvfSqEXE99LRlLnoIiAi1oVNGtmRgIjYjjClq7uTgIj47jxu99Ko/x/HmHxRljJAeAAAAABJRU5ErkJggg=="},80759:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-server-debug-98c2ec8a56860d6718e4da5bf97bc709.jpeg"},46399:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/rucio-tasks-a9f11e37004c47a3ee27c6549b968aee.jpg"},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>c});var s=i(96540);const t={},o=s.createContext(t);function r(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26c807fc.1453205a.js b/assets/js/26c807fc.1453205a.js deleted file mode 100644 index 80392bdfcb..0000000000 --- a/assets/js/26c807fc.1453205a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1788],{11434:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var s=a(74848),n=a(28453);const i={id:"metadata_attributes",title:"Metadata attributes"},o=void 0,r={id:"started/concepts/metadata_attributes",title:"Metadata attributes",description:"Meta-data associated with a dataset/file is represented using",source:"@site/../docs/started/concepts/metadata_attributes.md",sourceDirName:"started/concepts",slug:"/started/concepts/metadata_attributes",permalink:"/documentation/started/concepts/metadata_attributes",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/metadata_attributes.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"metadata_attributes",title:"Metadata attributes"},sidebar:"docs",previous:{title:"Rucio Storage Element",permalink:"/documentation/started/concepts/rucio_storage_element"},next:{title:"Permission model",permalink:"/documentation/started/concepts/permission_model"}},c={},d=[];function u(t){const e={code:"code",li:"li",p:"p",ul:"ul",...(0,n.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"Meta-data associated with a dataset/file is represented using\nattribute/value pairs. Meta-data attributes are classified into four\ncategories:"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"System-defined attributes"}),": size (bytes), checksums (adler32, md5),\ncreationtime, modificationtime, status, length (datasets/containers)"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Physics attributes"}),": GUID, number of events, project, datatype, run_number,\nstream_name, prod_step, version, campaign, lumiblocknr"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Workflow management attributes"}),": storing information like which task\n(task_id) or job (panda_id) produced the file"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Data management attributes"}),": necessary for the organisation of data on the\ngrid (see Replica Management section)"]}),"\n"]}),"\n",(0,s.jsx)(e.p,{children:"For datasets, it is possible that the value of a meta-data attribute is\na function of the meta-data of its constituents, e.g. the total size is\nthe sum of the sizes of the constituents. In this case it is not\npossible to assign a value to it."})]})}function l(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},28453:(t,e,a)=>{a.d(e,{R:()=>o,x:()=>r});var s=a(96540);const n={},i=s.createContext(n);function o(t){const e=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:o(t.components),s.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/26c807fc.36dd82e0.js b/assets/js/26c807fc.36dd82e0.js new file mode 100644 index 0000000000..24fb1b8f45 --- /dev/null +++ b/assets/js/26c807fc.36dd82e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1788],{11434:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var s=a(74848),n=a(28453);const i={id:"metadata_attributes",title:"Metadata attributes"},o=void 0,r={id:"started/concepts/metadata_attributes",title:"Metadata attributes",description:"Meta-data associated with a dataset/file is represented using",source:"@site/../docs/started/concepts/metadata_attributes.md",sourceDirName:"started/concepts",slug:"/started/concepts/metadata_attributes",permalink:"/documentation/started/concepts/metadata_attributes",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/metadata_attributes.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"metadata_attributes",title:"Metadata attributes"},sidebar:"docs",previous:{title:"Rucio Storage Element",permalink:"/documentation/started/concepts/rucio_storage_element"},next:{title:"Permission model",permalink:"/documentation/started/concepts/permission_model"}},c={},d=[];function u(t){const e={code:"code",li:"li",p:"p",ul:"ul",...(0,n.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"Meta-data associated with a dataset/file is represented using\nattribute/value pairs. Meta-data attributes are classified into four\ncategories:"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"System-defined attributes"}),": size (bytes), checksums (adler32, md5),\ncreationtime, modificationtime, status, length (datasets/containers)"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Physics attributes"}),": GUID, number of events, project, datatype, run_number,\nstream_name, prod_step, version, campaign, lumiblocknr"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Workflow management attributes"}),": storing information like which task\n(task_id) or job (panda_id) produced the file"]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Data management attributes"}),": necessary for the organisation of data on the\ngrid (see Replica Management section)"]}),"\n"]}),"\n",(0,s.jsx)(e.p,{children:"For datasets, it is possible that the value of a meta-data attribute is\na function of the meta-data of its constituents, e.g. the total size is\nthe sum of the sizes of the constituents. In this case it is not\npossible to assign a value to it."})]})}function l(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},28453:(t,e,a)=>{a.d(e,{R:()=>o,x:()=>r});var s=a(96540);const n={},i=s.createContext(n);function o(t){const e=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:o(t.components),s.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/31b36657.19a498ae.js b/assets/js/31b36657.19a498ae.js new file mode 100644 index 0000000000..4b35a35896 --- /dev/null +++ b/assets/js/31b36657.19a498ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8610],{17407:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=n(74848),s=n(28453);const o={id:"transfers-overview",title:"Transfers Overview"},i=void 0,a={id:"operator/transfers/transfers-overview",title:"Transfers Overview",description:"Rucio has a set of daemons in charge of transfers between rucio storage elements",source:"@site/../docs/operator/transfers/transfers_overview.md",sourceDirName:"operator/transfers",slug:"/operator/transfers/transfers-overview",permalink:"/documentation/operator/transfers/transfers-overview",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/transfers/transfers_overview.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"transfers-overview",title:"Transfers Overview"},sidebar:"docs",previous:{title:"Configuration parameters",permalink:"/documentation/operator/configuration_parameters"},next:{title:"Transfers Preparer",permalink:"/documentation/operator/transfers/transfers-preparer"}},l={},c=[{value:"Daemon overview",id:"daemon-overview",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Rucio has a set of daemons in charge of transfers between rucio storage elements\n(RSE). Historically, these daemons were grouped under the name of ",(0,r.jsx)(t.code,{children:"conveyor"}),",\nso a big part of the documentation and source code still uses this naming\nwhen referring to the transfer machinery."]}),"\n",(0,r.jsxs)(t.p,{children:["Rucio doesn't execute the actual physical data movement between storage\nelements. It relies on external tools for this scope. Currently, rucio supports\n",(0,r.jsx)(t.a,{href:"https://fts3-docs.web.cern.ch/fts3-docs/docs/overview.html",children:"fts3"})," and\n",(0,r.jsx)(t.a,{href:"https://www.globus.org/data-transfer",children:"globus"}),'. Rucio builds on top of these\n"TransferTools" and provides additional services like recovery from a transfer\nfailure by using another copy from another storage element, multi-hopping\nusing multiple transfertools (or multiple instances of the same transfertool\ntype) and others.']}),"\n",(0,r.jsx)(t.h2,{id:"daemon-overview",children:"Daemon overview"}),"\n",(0,r.jsx)(t.p,{children:"The following transfer-related daemons exist in rucio, presented in the order\nthey intervene in a transfer lifecycle:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"preparer"}),": a strongly recommended optional daemon which is required for\nmany advanced usages, like multiple transfertools together.\nIt is also required to be able to use throttler. If active, performs part\nof the source selection and path computation work instead of the submitter.\nFor all new rucio installation, it is recommended to run this daemon and\nactivate it by setting the ",(0,r.jsx)(t.code,{children:"conveyor/use_preparer = True"})," configuration\noption."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"throttler"}),": an optional daemon which can throttle request submissions\nto/from an RSE"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"submitter"}),", ",(0,r.jsx)(t.strong,{children:"stager"}),": perform the actual submission of transfers to the\nexternal transfertool. If used without preparer, also perform path computation\nand source replica selection. Stager is a specialized submitter for issuing\nstagein operations to tape archives."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"receiver"}),": optional daemons which listens for events published into a\nqueueing system (activemq) by the external transfertool and reacts to those\nevents to mark transfers as successful or failed."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"poller"}),": regularly polls the external transfertool for the status of\npending transfers and marks them as successful/failed"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"finisher"}),": acts on successful or failed transfers. For example, by\nre-scheduling a new attempt."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["The minimal list of daemons needed for transfer execution is:\n",(0,r.jsx)(t.code,{children:"submitter"}),", ",(0,r.jsx)(t.code,{children:"poller"})," and ",(0,r.jsx)(t.code,{children:"finisher"}),"."]}),"\n",(0,r.jsx)(t.h1,{id:"lifecycle-of-transfer-requests",children:"Lifecycle of transfer requests"}),"\n",(0,r.jsx)(t.p,{children:"There is no user-facing way to schedule a transfer. All transfer requests are\ncreated internally by rucio as result of rule evaluations. The lifetime of a\nrucio transfer is thus strongly bound to the rule which created it.\nHereafter is a simple example which gives the intuition of how rucio proceeds\nwith a replication/transfer of a file as part of a rule."}),"\n",(0,r.jsx)(t.p,{children:"In the rest of this example we'll assume the following 4 rucio storage\nelements:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 5 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2502 RSE1 \u2502 \u2502 RSE2 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u25b2 \u2502\n \u2502100 \u25023\n \u25bc \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 RSE3 \u2502 \u2502 RSE4 \u2502\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 2 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(t.p,{children:"The numbers on the arrows represent the administrative cost which is set\nby the rucio administrator. Cost is unidirectional, but, in this example,\nwe assume that the cost was configured identical in both directions.\nFor example:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"rucio-admin rse add-distance --distance 5 RSE1 RSE2\nrucio-admin rse add-distance --distance 5 RSE2 RSE1\n# Note: before rucio 1.30 (as a consequence: also in the current LTS release 1.29),\n# the --ranking option was used for the same purpose. The --distance option\n# could still be set and was mentioned in documentation alongside --ranking\n# but was completely ignored by rucio.\n# On 1.29, you'll have to use the following command:\nrucio-admin rse add-distance --ranking 5 RSE1 RSE2\nrucio-admin rse add-distance --ranking 5 RSE2 RSE1\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Assume a certain dataset ",(0,r.jsx)(t.code,{children:"someScope:dsName"}),", which has two files\n",(0,r.jsx)(t.code,{children:"someScope:file1"})," and ",(0,r.jsx)(t.code,{children:"someScope:file2"}),", and both files are located on ",(0,r.jsx)(t.code,{children:"RSE1"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"The destination of the transfer will be decided on the rule evaluation phase,\nFor example the user adds a rule to ensure that rucio maintains two copies\nfor each of the files on any of the RSEs."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"rucio add-rule someScope:dsName 2 '*'\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The rule evaluation mechanism detects that a copy is already available\non RSE1, but one additional copy is needed to respect the rule requirements of\n2 copies. It will thus create a transfer request to one of the other 3 rses.\nAs of time of writing, the selection of the destination is random as\nlong as it respects the RSE expression. Here, ",(0,r.jsx)(t.code,{children:"*"})," matches any RSE.\nFor the seek of the example, lets assume that RSE4 was selected."]}),"\n",(0,r.jsxs)(t.p,{children:["The rule evaluation mechanism will then create two transfer requests, which\nwill be picked by the transfer machinery. Depending on the configuration value\n",(0,r.jsx)(t.code,{children:"conveyor/use_preparer"}),", the transfer will be either handled by the ",(0,r.jsx)(t.code,{children:"preparer"}),"\nor by the ",(0,r.jsx)(t.code,{children:"submitter"})," directly."]}),"\n",(0,r.jsxs)(t.p,{children:["At this stage, the transfer machinery finds all the possible sources. It\nfilters out the ones which don't match different rule criterias (for example:\nsource RSE expression) and administrative constraints (for example:\nskip blocklisted RSEs). It then computes the paths. In the previous example,\nthe path ",(0,r.jsx)(t.code,{children:"RSE1 -> RSE2 -> RSE3 -> RSE4"})," will be picked due to cost constraints.\nNote that it's possible to make rucio prefer shorter parts by setting the RSE\nattribute ",(0,r.jsx)(t.code,{children:"hop_penalty"}),", or the global configuration value with the same name.\nFor more details about how a source is selected, refer to the ",(0,r.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-preparer",children:"Preparer"}),"\ndocumentation."]}),"\n",(0,r.jsx)(t.p,{children:"The path will be then submitted to the transfertool either in its integrity,\nif transfertool supports multi-hopping, or in multiple iterations."}),"\n",(0,r.jsxs)(t.p,{children:["The final steps are for the ",(0,r.jsx)(t.code,{children:"reciver"})," or ",(0,r.jsx)(t.code,{children:"poller"})," to monitor the transfer's\ncompletion in transfertool and ",(0,r.jsx)(t.code,{children:"finisher"})," to mark the transfers as completed.\nWe only described here a simple case, when the transfer is successful on the\nfirst try. In case of errors, multiple transitions are possible between\ndifferent daemons. Check the following request state transition diagram\nfor a more detailed view:"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Request State Transition Chart",src:n(77756).A+"",width:"3131",height:"7564"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},77756:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/request_state_transition_chart-ac293c9924265950b36ebc9d9ddf8895.svg"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(96540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/31b36657.25c65289.js b/assets/js/31b36657.25c65289.js deleted file mode 100644 index bdcc7c1a00..0000000000 --- a/assets/js/31b36657.25c65289.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8610],{17407:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=n(74848),s=n(28453);const o={id:"transfers-overview",title:"Transfers Overview"},i=void 0,a={id:"operator/transfers/transfers-overview",title:"Transfers Overview",description:"Rucio has a set of daemons in charge of transfers between rucio storage elements",source:"@site/../docs/operator/transfers/transfers_overview.md",sourceDirName:"operator/transfers",slug:"/operator/transfers/transfers-overview",permalink:"/documentation/operator/transfers/transfers-overview",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/transfers/transfers_overview.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"transfers-overview",title:"Transfers Overview"},sidebar:"docs",previous:{title:"Configuration parameters",permalink:"/documentation/operator/configuration_parameters"},next:{title:"Transfers Preparer",permalink:"/documentation/operator/transfers/transfers-preparer"}},l={},c=[{value:"Daemon overview",id:"daemon-overview",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Rucio has a set of daemons in charge of transfers between rucio storage elements\n(RSE). Historically, these daemons were grouped under the name of ",(0,r.jsx)(t.code,{children:"conveyor"}),",\nso a big part of the documentation and source code still uses this naming\nwhen referring to the transfer machinery."]}),"\n",(0,r.jsxs)(t.p,{children:["Rucio doesn't execute the actual physical data movement between storage\nelements. It relies on external tools for this scope. Currently, rucio supports\n",(0,r.jsx)(t.a,{href:"https://fts3-docs.web.cern.ch/fts3-docs/docs/overview.html",children:"fts3"})," and\n",(0,r.jsx)(t.a,{href:"https://www.globus.org/data-transfer",children:"globus"}),'. Rucio builds on top of these\n"TransferTools" and provides additional services like recovery from a transfer\nfailure by using another copy from another storage element, multi-hopping\nusing multiple transfertools (or multiple instances of the same transfertool\ntype) and others.']}),"\n",(0,r.jsx)(t.h2,{id:"daemon-overview",children:"Daemon overview"}),"\n",(0,r.jsx)(t.p,{children:"The following transfer-related daemons exist in rucio, presented in the order\nthey intervene in a transfer lifecycle:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"preparer"}),": a strongly recommended optional daemon which is required for\nmany advanced usages, like multiple transfertools together.\nIt is also required to be able to use throttler. If active, performs part\nof the source selection and path computation work instead of the submitter.\nFor all new rucio installation, it is recommended to run this daemon and\nactivate it by setting the ",(0,r.jsx)(t.code,{children:"conveyor/use_preparer = True"})," configuration\noption."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"throttler"}),": an optional daemon which can throttle request submissions\nto/from an RSE"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"submitter"}),", ",(0,r.jsx)(t.strong,{children:"stager"}),": perform the actual submission of transfers to the\nexternal transfertool. If used without preparer, also perform path computation\nand source replica selection. Stager is a specialized submitter for issuing\nstagein operations to tape archives."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"receiver"}),": optional daemons which listens for events published into a\nqueueing system (activemq) by the external transfertool and reacts to those\nevents to mark transfers as successful or failed."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"poller"}),": regularly polls the external transfertool for the status of\npending transfers and marks them as successful/failed"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"finisher"}),": acts on successful or failed transfers. For example, by\nre-scheduling a new attempt."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["The minimal list of daemons needed for transfer execution is:\n",(0,r.jsx)(t.code,{children:"submitter"}),", ",(0,r.jsx)(t.code,{children:"poller"})," and ",(0,r.jsx)(t.code,{children:"finisher"}),"."]}),"\n",(0,r.jsx)(t.h1,{id:"lifecycle-of-transfer-requests",children:"Lifecycle of transfer requests"}),"\n",(0,r.jsx)(t.p,{children:"There is no user-facing way to schedule a transfer. All transfer requests are\ncreated internally by rucio as result of rule evaluations. The lifetime of a\nrucio transfer is thus strongly bound to the rule which created it.\nHereafter is a simple example which gives the intuition of how rucio proceeds\nwith a replication/transfer of a file as part of a rule."}),"\n",(0,r.jsx)(t.p,{children:"In the rest of this example we'll assume the following 4 rucio storage\nelements:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 5 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2502 RSE1 \u2502 \u2502 RSE2 \u2502\n\u2502 \u2502 \u250c\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u25b2 \u2502\n \u2502100 \u25023\n \u25bc \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2518 \u2502 \u2502\n\u2502 RSE3 \u2502 \u2502 RSE4 \u2502\n\u2502 \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 2 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(t.p,{children:"The numbers on the arrows represent the administrative cost which is set\nby the rucio administrator. Cost is unidirectional, but, in this example,\nwe assume that the cost was configured identical in both directions.\nFor example:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"rucio-admin rse add-distance --distance 5 RSE1 RSE2\nrucio-admin rse add-distance --distance 5 RSE2 RSE1\n# Note: before rucio 1.30 (as a consequence: also in the current LTS release 1.29),\n# the --ranking option was used for the same purpose. The --distance option\n# could still be set and was mentioned in documentation alongside --ranking\n# but was completely ignored by rucio.\n# On 1.29, you'll have to use the following command:\nrucio-admin rse add-distance --ranking 5 RSE1 RSE2\nrucio-admin rse add-distance --ranking 5 RSE2 RSE1\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Assume a certain dataset ",(0,r.jsx)(t.code,{children:"someScope:dsName"}),", which has two files\n",(0,r.jsx)(t.code,{children:"someScope:file1"})," and ",(0,r.jsx)(t.code,{children:"someScope:file2"}),", and both files are located on ",(0,r.jsx)(t.code,{children:"RSE1"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"The destination of the transfer will be decided on the rule evaluation phase,\nFor example the user adds a rule to ensure that rucio maintains two copies\nfor each of the files on any of the RSEs."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"rucio add-rule someScope:dsName 2 '*'\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The rule evaluation mechanism detects that a copy is already available\non RSE1, but one additional copy is needed to respect the rule requirements of\n2 copies. It will thus create a transfer request to one of the other 3 rses.\nAs of time of writing, the selection of the destination is random as\nlong as it respects the RSE expression. Here, ",(0,r.jsx)(t.code,{children:"*"})," matches any RSE.\nFor the seek of the example, lets assume that RSE4 was selected."]}),"\n",(0,r.jsxs)(t.p,{children:["The rule evaluation mechanism will then create two transfer requests, which\nwill be picked by the transfer machinery. Depending on the configuration value\n",(0,r.jsx)(t.code,{children:"conveyor/use_preparer"}),", the transfer will be either handled by the ",(0,r.jsx)(t.code,{children:"preparer"}),"\nor by the ",(0,r.jsx)(t.code,{children:"submitter"})," directly."]}),"\n",(0,r.jsxs)(t.p,{children:["At this stage, the transfer machinery finds all the possible sources. It\nfilters out the ones which don't match different rule criterias (for example:\nsource RSE expression) and administrative constraints (for example:\nskip blocklisted RSEs). It then computes the paths. In the previous example,\nthe path ",(0,r.jsx)(t.code,{children:"RSE1 -> RSE2 -> RSE3 -> RSE4"})," will be picked due to cost constraints.\nNote that it's possible to make rucio prefer shorter parts by setting the RSE\nattribute ",(0,r.jsx)(t.code,{children:"hop_penalty"}),", or the global configuration value with the same name.\nFor more details about how a source is selected, refer to the ",(0,r.jsx)(t.a,{href:"/documentation/operator/transfers/transfers-preparer",children:"Preparer"}),"\ndocumentation."]}),"\n",(0,r.jsx)(t.p,{children:"The path will be then submitted to the transfertool either in its integrity,\nif transfertool supports multi-hopping, or in multiple iterations."}),"\n",(0,r.jsxs)(t.p,{children:["The final steps are for the ",(0,r.jsx)(t.code,{children:"reciver"})," or ",(0,r.jsx)(t.code,{children:"poller"})," to monitor the transfer's\ncompletion in transfertool and ",(0,r.jsx)(t.code,{children:"finisher"})," to mark the transfers as completed.\nWe only described here a simple case, when the transfer is successful on the\nfirst try. In case of errors, multiple transitions are possible between\ndifferent daemons. Check the following request state transition diagram\nfor a more detailed view:"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Request State Transition Chart",src:n(77756).A+"",width:"3131",height:"7564"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},77756:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/request_state_transition_chart-ac293c9924265950b36ebc9d9ddf8895.svg"},28453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(96540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c621cea.6f4253ed.js b/assets/js/3c621cea.6f4253ed.js deleted file mode 100644 index e60752a12b..0000000000 --- a/assets/js/3c621cea.6f4253ed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[283],{64687:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>t,frontMatter:()=>_,metadata:()=>c,toc:()=>d});var l=i(74848),r=i(28453);const _={id:"installing_daemons",title:"Installing Rucio Daemons"},s=void 0,c={id:"operator/installing_daemons",title:"Installing Rucio Daemons",description:"Prerequisites",source:"@site/../docs/operator/installing_daemons.md",sourceDirName:"operator",slug:"/operator/installing_daemons",permalink:"/documentation/operator/installing_daemons",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/installing_daemons.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"installing_daemons",title:"Installing Rucio Daemons"},sidebar:"docs",previous:{title:"Installing Rucio Server",permalink:"/documentation/operator/installing_server"},next:{title:"Configuration",permalink:"/documentation/operator/configuration"}},a={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install via pip",id:"install-via-pip",level:2},{value:"Install via Docker",id:"install-via-docker",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"RUCIO_DAEMON",id:"rucio_daemon",level:3},{value:"RUCIO_DAEMON_ARGS",id:"rucio_daemon_args",level:3},{value:"RUCIO_ENABLE_LOGS",id:"rucio_enable_logs",level:3},{value:"RUCIO_CFG configuration parameters",id:"rucio_cfg-configuration-parameters",level:3}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,l.jsx)(n.p,{children:"The Rucio daemons run on Python 2.7, 3.6 and 3.7 on any Unix-like\nplatform."}),"\n",(0,l.jsx)(n.h2,{id:"install-via-pip",children:"Install via pip"}),"\n",(0,l.jsx)(n.p,{children:"Heads up: We recommend to use the docker-based install (see next\nsection) as it will configure many things for you automatically. Only\nuse the pip-based install if you have a good reason and know how to\nconfigure your web service manually:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pip install rucio\n"})}),"\n",(0,l.jsxs)(n.p,{children:["This will pull the latest release from\n",(0,l.jsx)(n.a,{href:"https://pypi.python.org/pypi/rucio/",children:(0,l.jsx)(n.strong,{children:"PyPi"})}),". The Rucio server also needs\nseveral Python dependencies. These are all listed in the file\n",(0,l.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/requirements/requirements.server.txt",children:(0,l.jsx)(n.code,{children:"requirements.server.txt"})}),"\nand will be pulled in as necessary."]}),"\n",(0,l.jsx)(n.h2,{id:"install-via-docker",children:"Install via Docker"}),"\n",(0,l.jsx)(n.p,{children:"This image provides the Rucio daemons. Each daemon has to be run in a\nseparate container. It supports MySQL, PostgreSQL, Oracle, and SQLite as\ndatabase backends."}),"\n",(0,l.jsxs)(n.p,{children:["This image expects that there is an already initialised Rucio DB. To\nstart a simple ",(0,l.jsx)(n.code,{children:"judge-cleaner"})," daemon using a database on\n",(0,l.jsx)(n.code,{children:"mysql.db"})," without any additional parameters just run this:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'docker run --name=rucio-judge-cleaner \\\n -e RUCIO_CFG_DATABASE_DEFAULT="mysql+pymysql://rucio:rucio@mysql.db/rucio" \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n'})}),"\n",(0,l.jsxs)(n.p,{children:["The ",(0,l.jsx)(n.code,{children:"RUCIO_DAEMON"})," environment variable gives the name of\nthe rucio daemon."]}),"\n",(0,l.jsxs)(n.p,{children:["Rucio can be configured fully using environment variables like\n",(0,l.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". If you want to instead use a\ncomplete rucio.cfg it can also be mounted. This will then ignore the\n",(0,l.jsx)(n.code,{children:"RUCIO_CFG"})," environment variables:"]}),"\n",(0,l.jsx)(n.p,{children:"The rucio.cfg is used to configure the database backend and the daemons:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n"})}),"\n",(0,l.jsxs)(n.p,{children:["By default the daemon logs are written to stdout and stderr if you want\nto write to a file you can use ",(0,l.jsx)(n.code,{children:"RUCIO_ENABLE_LOGS"})," like\nthis:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -v /tmp/logs:/var/log/rucio -e RUCIO_DAEMON=judge-cleaner \\\n -e RUCIO_ENABLE_LOGS=True \\\n rucio/rucio-daemons\n"})}),"\n",(0,l.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,l.jsxs)(n.p,{children:["As shown in the examples above the rucio-daemon image can be configured\nusing environment variables that are passed with ",(0,l.jsx)(n.code,{children:"docker run"}),".\nBelow is a list of all available variables and their behaviour:"]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_daemon",children:"RUCIO_DAEMON"}),"\n",(0,l.jsxs)(n.p,{children:["This variable is mandatory and it specifies the name of the daemon,\ne.g., ",(0,l.jsx)(n.code,{children:"hermes"}),", ",(0,l.jsx)(n.code,{children:"kronos"}),",\n",(0,l.jsx)(n.code,{children:"judge-evaluator"}),", etc."]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_daemon_args",children:"RUCIO_DAEMON_ARGS"}),"\n",(0,l.jsxs)(n.p,{children:["Any additional command line parameter can be specified here, e.g.,\n",(0,l.jsx)(n.code,{children:"\\--run-once"})," This field is optional."]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_enable_logs",children:"RUCIO_ENABLE_LOGS"}),"\n",(0,l.jsxs)(n.p,{children:["By default, the log output of the daemon is written to stdout and\nstderr. If you set this variable to ",(0,l.jsx)(n.code,{children:"True"})," the output will\nbe written to ",(0,l.jsx)(n.code,{children:"access_log"})," and ",(0,l.jsx)(n.code,{children:"error_log"})," under\n",(0,l.jsx)(n.code,{children:"/var/log/rucio"})]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_cfg-configuration-parameters",children:"RUCIO_CFG configuration parameters"}),"\n",(0,l.jsxs)(n.p,{children:["Environment variables can be used to set values for the auto-generated\nrucio.cfg. The names are derived from the actual names in the\nconfiguration file prefixed by ",(0,l.jsx)(n.code,{children:"RUCIO_CFG"}),", e.g., the\n",(0,l.jsx)(n.code,{children:"default"})," value in the ",(0,l.jsx)(n.code,{children:"database"})," section\nbecomes ",(0,l.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". All available\nenvironment variables are:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_ACCOUNTS_SPECIAL_ACCOUNTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGDIR"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGLEVEL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_MAILTEMPLATEDIR"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RESET_ON_RETURN"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_ECHO"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RECYCLE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_SIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_MAX_OVERFLOW"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERACCOUNT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERPASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_SERVER"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_USER_SCOPE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_POLICY"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_LFN2PFN_ALGORITHM_DEFAULT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT_RUCIO"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SITES"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SLEEP_TIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_DATASET_LIFETIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SET_METADATA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_RESULTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_CACHE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SCHEME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_TRANSFERTOOL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSHOSTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACERT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USERCERT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACHE_TIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USE_DETERMINISTIC_ID"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_POLL_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SUBMIT_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_BRING_ONLINE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_QUEUE_MODE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USING_MEMCACHE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSMONHOSTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USERNAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_NONSSL_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USE_SSL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_FROM"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_TEST"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_QUEUE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_PREFETCH_SIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_CHUNKSIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SUBSCRIPTION_ID"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_USE_SSL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_RECONNECT_ATTEMPTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_EXCLUDED_USRDNS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_USERNAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_DATASET_WAIT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_ACCOUNT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_GCS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_SIGNATURE_LIFETIME"}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var l=i(96540);const r={},_=l.createContext(r);function s(e){const n=l.useContext(_);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(_.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c621cea.c86d1b96.js b/assets/js/3c621cea.c86d1b96.js new file mode 100644 index 0000000000..f60b5bbdc1 --- /dev/null +++ b/assets/js/3c621cea.c86d1b96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[283],{64687:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>t,frontMatter:()=>_,metadata:()=>c,toc:()=>d});var l=i(74848),r=i(28453);const _={id:"installing_daemons",title:"Installing Rucio Daemons"},s=void 0,c={id:"operator/installing_daemons",title:"Installing Rucio Daemons",description:"Prerequisites",source:"@site/../docs/operator/installing_daemons.md",sourceDirName:"operator",slug:"/operator/installing_daemons",permalink:"/documentation/operator/installing_daemons",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/installing_daemons.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"installing_daemons",title:"Installing Rucio Daemons"},sidebar:"docs",previous:{title:"Installing Rucio Server",permalink:"/documentation/operator/installing_server"},next:{title:"Configuration",permalink:"/documentation/operator/configuration"}},a={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install via pip",id:"install-via-pip",level:2},{value:"Install via Docker",id:"install-via-docker",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"RUCIO_DAEMON",id:"rucio_daemon",level:3},{value:"RUCIO_DAEMON_ARGS",id:"rucio_daemon_args",level:3},{value:"RUCIO_ENABLE_LOGS",id:"rucio_enable_logs",level:3},{value:"RUCIO_CFG configuration parameters",id:"rucio_cfg-configuration-parameters",level:3}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,l.jsx)(n.p,{children:"The Rucio daemons run on Python 2.7, 3.6 and 3.7 on any Unix-like\nplatform."}),"\n",(0,l.jsx)(n.h2,{id:"install-via-pip",children:"Install via pip"}),"\n",(0,l.jsx)(n.p,{children:"Heads up: We recommend to use the docker-based install (see next\nsection) as it will configure many things for you automatically. Only\nuse the pip-based install if you have a good reason and know how to\nconfigure your web service manually:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"pip install rucio\n"})}),"\n",(0,l.jsxs)(n.p,{children:["This will pull the latest release from\n",(0,l.jsx)(n.a,{href:"https://pypi.python.org/pypi/rucio/",children:(0,l.jsx)(n.strong,{children:"PyPi"})}),". The Rucio server also needs\nseveral Python dependencies. These are all listed in the file\n",(0,l.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/requirements/requirements.server.txt",children:(0,l.jsx)(n.code,{children:"requirements.server.txt"})}),"\nand will be pulled in as necessary."]}),"\n",(0,l.jsx)(n.h2,{id:"install-via-docker",children:"Install via Docker"}),"\n",(0,l.jsx)(n.p,{children:"This image provides the Rucio daemons. Each daemon has to be run in a\nseparate container. It supports MySQL, PostgreSQL, Oracle, and SQLite as\ndatabase backends."}),"\n",(0,l.jsxs)(n.p,{children:["This image expects that there is an already initialised Rucio DB. To\nstart a simple ",(0,l.jsx)(n.code,{children:"judge-cleaner"})," daemon using a database on\n",(0,l.jsx)(n.code,{children:"mysql.db"})," without any additional parameters just run this:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'docker run --name=rucio-judge-cleaner \\\n -e RUCIO_CFG_DATABASE_DEFAULT="mysql+pymysql://rucio:rucio@mysql.db/rucio" \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n'})}),"\n",(0,l.jsxs)(n.p,{children:["The ",(0,l.jsx)(n.code,{children:"RUCIO_DAEMON"})," environment variable gives the name of\nthe rucio daemon."]}),"\n",(0,l.jsxs)(n.p,{children:["Rucio can be configured fully using environment variables like\n",(0,l.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". If you want to instead use a\ncomplete rucio.cfg it can also be mounted. This will then ignore the\n",(0,l.jsx)(n.code,{children:"RUCIO_CFG"})," environment variables:"]}),"\n",(0,l.jsx)(n.p,{children:"The rucio.cfg is used to configure the database backend and the daemons:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -e RUCIO_DAEMON=judge-cleaner \\\n rucio/rucio-daemons\n"})}),"\n",(0,l.jsxs)(n.p,{children:["By default the daemon logs are written to stdout and stderr if you want\nto write to a file you can use ",(0,l.jsx)(n.code,{children:"RUCIO_ENABLE_LOGS"})," like\nthis:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run --name=rucio-judge-cleaner \\\n -v /tmp/rucio.cfg:/opt/rucio/etc/rucio.cfg \\\n -v /tmp/logs:/var/log/rucio -e RUCIO_DAEMON=judge-cleaner \\\n -e RUCIO_ENABLE_LOGS=True \\\n rucio/rucio-daemons\n"})}),"\n",(0,l.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,l.jsxs)(n.p,{children:["As shown in the examples above the rucio-daemon image can be configured\nusing environment variables that are passed with ",(0,l.jsx)(n.code,{children:"docker run"}),".\nBelow is a list of all available variables and their behaviour:"]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_daemon",children:"RUCIO_DAEMON"}),"\n",(0,l.jsxs)(n.p,{children:["This variable is mandatory and it specifies the name of the daemon,\ne.g., ",(0,l.jsx)(n.code,{children:"hermes"}),", ",(0,l.jsx)(n.code,{children:"kronos"}),",\n",(0,l.jsx)(n.code,{children:"judge-evaluator"}),", etc."]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_daemon_args",children:"RUCIO_DAEMON_ARGS"}),"\n",(0,l.jsxs)(n.p,{children:["Any additional command line parameter can be specified here, e.g.,\n",(0,l.jsx)(n.code,{children:"\\--run-once"})," This field is optional."]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_enable_logs",children:"RUCIO_ENABLE_LOGS"}),"\n",(0,l.jsxs)(n.p,{children:["By default, the log output of the daemon is written to stdout and\nstderr. If you set this variable to ",(0,l.jsx)(n.code,{children:"True"})," the output will\nbe written to ",(0,l.jsx)(n.code,{children:"access_log"})," and ",(0,l.jsx)(n.code,{children:"error_log"})," under\n",(0,l.jsx)(n.code,{children:"/var/log/rucio"})]}),"\n",(0,l.jsx)(n.h3,{id:"rucio_cfg-configuration-parameters",children:"RUCIO_CFG configuration parameters"}),"\n",(0,l.jsxs)(n.p,{children:["Environment variables can be used to set values for the auto-generated\nrucio.cfg. The names are derived from the actual names in the\nconfiguration file prefixed by ",(0,l.jsx)(n.code,{children:"RUCIO_CFG"}),", e.g., the\n",(0,l.jsx)(n.code,{children:"default"})," value in the ",(0,l.jsx)(n.code,{children:"database"})," section\nbecomes ",(0,l.jsx)(n.code,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),". All available\nenvironment variables are:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_ACCOUNTS_SPECIAL_ACCOUNTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGDIR"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_LOGLEVEL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_COMMON_MAILTEMPLATEDIR"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_DEFAULT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RESET_ON_RETURN"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_ECHO"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_RECYCLE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_SIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POOL_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_MAX_OVERFLOW"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERACCOUNT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_DATABASE_POWUSERPASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_SERVER"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_CARBON_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MONITOR_USER_SCOPE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_POLICY"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SCHEMA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_LFN2PFN_ALGORITHM_DEFAULT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_PERMISSION_SUPPORT_RUCIO"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SITES"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SLEEP_TIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_DATASET_LIFETIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUTOMATIX_SET_METADATA"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_RESULTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_AUDITOR_CACHE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SCHEME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_TRANSFERTOOL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSHOSTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACERT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USERCERT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_CACHE_TIME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USE_DETERMINISTIC_ID"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_POLL_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_SUBMIT_TIMEOUT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_BRING_ONLINE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_QUEUE_MODE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_USING_MEMCACHE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CONVEYOR_FTSMONHOSTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_FTS3_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USERNAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_NONSSL_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_USE_SSL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_FROM"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_HERMES_EMAIL_TEST"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_QUEUE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_PREFETCH_SIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_CHUNKSIZE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_SUBSCRIPTION_ID"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_USE_SSL"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_RECONNECT_ATTEMPTS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_EXCLUDED_USRDNS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_USERNAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_KRONOS_PASSWORD"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_TRACER_DATASET_WAIT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_PORT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_KEY_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_SSL_CERT_FILE"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_DESTINATION"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_BROKERS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_VONAME"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_MESSAGING_CACHE_ACCOUNT"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_GCS"}),"\n",(0,l.jsx)(n.li,{children:"RUCIO_CFG_CREDENTIALS_SIGNATURE_LIFETIME"}),"\n"]})]})}function t(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var l=i(96540);const r={},_=l.createContext(r);function s(e){const n=l.useContext(_);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(_.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e04ff1b.971196b1.js b/assets/js/3e04ff1b.971196b1.js new file mode 100644 index 0000000000..29ef861214 --- /dev/null +++ b/assets/js/3e04ff1b.971196b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[586],{93767:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=t(74848),s=t(28453);const r={title:"Replica management with replication rules"},l=void 0,o={id:"started/concepts/replica_management",title:"Replica management with replication rules",description:"Replica management is based on replication rules defined on data identifiers",source:"@site/../docs/started/concepts/replica_management.md",sourceDirName:"started/concepts",slug:"/started/concepts/replica_management",permalink:"/documentation/started/concepts/replica_management",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_management.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{title:"Replica management with replication rules"},sidebar:"docs",previous:{title:"Permission model",permalink:"/documentation/started/concepts/permission_model"},next:{title:"Replication rule examples",permalink:"/documentation/started/concepts/replication_rules_examples"}},a={},d=[{value:"Rule grouping and replica storage",id:"rule-grouping-and-replica-storage",level:2},{value:"Footnotes",id:"footnotes",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",section:"section",strong:"strong",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Replica management is based on replication rules defined on data identifiers\n(files, datasets, containers). A replication rule is owned by an account and\ndefines the minimum number of replicas to be available on a list of RSEs,\ndenoted by an ",(0,i.jsx)(n.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expression"}),". Accounts are allowed to set\nmultiple rules",(0,i.jsx)(n.sup,{children:(0,i.jsx)(n.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),". Rules may optionally have a limited lifetime and can be\nadded, removed or modified at any time."]}),"\n",(0,i.jsx)(n.p,{children:"An example listing of replication rules is given below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"prod: 1x replica @ CERN, no lifetime"}),"\n",(0,i.jsx)(n.li,{children:"barisits: 1x replica @ US-T2, until 2019-01-01"}),"\n",(0,i.jsx)(n.li,{children:"vgaronne: 2x replica @ T1, no lifetime"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"A rule engine validates the rules and creates transfer primitives to fulfil all\nrules, e.g. transfer a file from RSE A to RSE B. The rule engine is triggered\nwhen a new rule is defined on an existing data identifier, or when a file is\nadded to a dataset with existing rules. The rule engine will only create the\nminimum set of necessary transfer primitives to satisfy all rules."}),"\n",(0,i.jsx)(n.p,{children:"Notifications can be provided for rules and their underlying transfer\nrequests. All transfer requests are transient."}),"\n",(0,i.jsx)(n.p,{children:"The deletion service supports two different modes: greedy and non-greedy. Greedy\nmeans that the service tries to immediately delete all replicas which are not\nprotected by a replication rule. Non-greedy deletion is triggered when storage\npolicy dictates that space must be freed. The deletion service will look for\nreplicas on that RSE which can be deleted without violating any replication\nrule. The deletion service will use a Least Recently Used (LRU) algorithm to\nselect replicas for deletion. The deletion service will also immediately delete\nall replicas of any file which is declared obsolete."}),"\n",(0,i.jsxs)(n.p,{children:["Some examples of replication rules are listed\n",(0,i.jsx)(n.a,{href:"/documentation/started/concepts/replication_rules_examples",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"rule-grouping-and-replica-storage",children:"Rule grouping and replica storage"}),"\n",(0,i.jsx)(n.p,{children:"The following two parameters determine the way the files to be replicated\nare assigned to suitable RSEs:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.strong,{children:"rule grouping"}),": ",(0,i.jsx)(n.code,{children:"ALL"}),", ",(0,i.jsx)(n.code,{children:"DATASET"}),", ",(0,i.jsx)(n.code,{children:"NONE"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"/documentation/started/concepts/file_dataset_container",children:"DID type"}),": ",(0,i.jsx)(n.code,{children:"FILE"}),", ",(0,i.jsx)(n.code,{children:"DATASET"}),", ",(0,i.jsx)(n.code,{children:"CONTAINER"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The table below describes the resulting replication logic\ndepending on the combination of rule grouping (header row) and DID type (left column)."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"ALL"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"DATASET"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"NONE"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"FILE"})}),(0,i.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(n.td,{children:"N/A"}),(0,i.jsx)(n.td,{children:"No restrictions"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"DATASET"})}),(0,i.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(n.td,{children:"N/A"}),(0,i.jsx)(n.td,{children:"No restrictions"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"CONTAINER"})}),(0,i.jsx)(n.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(n.td,{children:"All files in a dataset must be on the same RSE, but different datasets can be on different RSEs"}),(0,i.jsx)(n.td,{children:"No restrictions"})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"footnotes",children:"Footnotes"}),"\n","\n",(0,i.jsxs)(n.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(n.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{id:"user-content-fn-1",children:["\n",(0,i.jsxs)(n.p,{children:["The system may reject rules if these violate other policies, e.g., only\nspecific accounts are allowed to request replication rules for tape systems. ",(0,i.jsx)(n.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},r=i.createContext(s);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e04ff1b.b69f213e.js b/assets/js/3e04ff1b.b69f213e.js deleted file mode 100644 index 22432649e8..0000000000 --- a/assets/js/3e04ff1b.b69f213e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[586],{93767:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=n(74848),s=n(28453);const r={title:"Replica management with replication rules"},l=void 0,o={id:"started/concepts/replica_management",title:"Replica management with replication rules",description:"Replica management is based on replication rules defined on data identifiers",source:"@site/../docs/started/concepts/replica_management.md",sourceDirName:"started/concepts",slug:"/started/concepts/replica_management",permalink:"/documentation/started/concepts/replica_management",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/concepts/replica_management.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{title:"Replica management with replication rules"},sidebar:"docs",previous:{title:"Permission model",permalink:"/documentation/started/concepts/permission_model"},next:{title:"Replication rule examples",permalink:"/documentation/started/concepts/replication_rules_examples"}},a={},d=[{value:"Rule grouping and replica storage",id:"rule-grouping-and-replica-storage",level:2},{value:"Footnotes",id:"footnotes",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",section:"section",strong:"strong",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Replica management is based on replication rules defined on data identifiers\n(files, datasets, containers). A replication rule is owned by an account and\ndefines the minimum number of replicas to be available on a list of RSEs,\ndenoted by an ",(0,i.jsx)(t.a,{href:"/documentation/started/concepts/rse_expressions",children:"RSE Expression"}),". Accounts are allowed to set\nmultiple rules",(0,i.jsx)(t.sup,{children:(0,i.jsx)(t.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})}),". Rules may optionally have a limited lifetime and can be\nadded, removed or modified at any time."]}),"\n",(0,i.jsx)(t.p,{children:"An example listing of replication rules is given below:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"prod: 1x replica @ CERN, no lifetime"}),"\n",(0,i.jsx)(t.li,{children:"barisits: 1x replica @ US-T2, until 2019-01-01"}),"\n",(0,i.jsx)(t.li,{children:"vgaronne: 2x replica @ T1, no lifetime"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"A rule engine validates the rules and creates transfer primitives to fulfil all\nrules, e.g. transfer a file from RSE A to RSE B. The rule engine is triggered\nwhen a new rule is defined on an existing data identifier, or when a file is\nadded to a dataset with existing rules. The rule engine will only create the\nminimum set of necessary transfer primitives to satisfy all rules."}),"\n",(0,i.jsx)(t.p,{children:"Notifications can be provided for rules and their underlying transfer\nrequests. All transfer requests are transient."}),"\n",(0,i.jsx)(t.p,{children:"The deletion service supports two different modes: greedy and non-greedy. Greedy\nmeans that the service tries to immediately delete all replicas which are not\nprotected by a replication rule. Non-greedy deletion is triggered when storage\npolicy dictates that space must be freed. The deletion service will look for\nreplicas on that RSE which can be deleted without violating any replication\nrule. The deletion service will use a Least Recently Used (LRU) algorithm to\nselect replicas for deletion. The deletion service will also immediately delete\nall replicas of any file which is declared obsolete."}),"\n",(0,i.jsxs)(t.p,{children:["Some examples of replication rules are listed\n",(0,i.jsx)(t.a,{href:"/documentation/started/concepts/replication_rules_examples",children:"here"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"rule-grouping-and-replica-storage",children:"Rule grouping and replica storage"}),"\n",(0,i.jsx)(t.p,{children:"The following two parameters determine the way the files to be replicated\nare assigned to suitable RSEs:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["The ",(0,i.jsx)(t.strong,{children:"rule grouping"}),": ",(0,i.jsx)(t.code,{children:"ALL"}),", ",(0,i.jsx)(t.code,{children:"DATASET"}),", ",(0,i.jsx)(t.code,{children:"NONE"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["The ",(0,i.jsx)(t.a,{href:"/documentation/started/concepts/file_dataset_container",children:"DID type"}),": ",(0,i.jsx)(t.code,{children:"FILE"}),", ",(0,i.jsx)(t.code,{children:"DATASET"}),", ",(0,i.jsx)(t.code,{children:"CONTAINER"}),"."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The table below describes the resulting replication logic\ndepending on the combination of rule grouping (header row) and DID type (left column)."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{}),(0,i.jsx)(t.th,{children:(0,i.jsx)(t.strong,{children:"ALL"})}),(0,i.jsx)(t.th,{children:(0,i.jsx)(t.strong,{children:"DATASET"})}),(0,i.jsx)(t.th,{children:(0,i.jsx)(t.strong,{children:"NONE"})})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.strong,{children:"FILE"})}),(0,i.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsx)(t.td,{children:"No restrictions"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.strong,{children:"DATASET"})}),(0,i.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(t.td,{children:"N/A"}),(0,i.jsx)(t.td,{children:"No restrictions"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.strong,{children:"CONTAINER"})}),(0,i.jsx)(t.td,{children:"All files must be on the same RSE"}),(0,i.jsx)(t.td,{children:"All files in a dataset must be on the same RSE, but different datasets can be on different RSEs"}),(0,i.jsx)(t.td,{children:"No restrictions"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"footnotes",children:"Footnotes"}),"\n","\n",(0,i.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,i.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{id:"user-content-fn-1",children:["\n",(0,i.jsxs)(t.p,{children:["The system may reject rules if these violate other policies, e.g., only\nspecific accounts are allowed to request replication rules for tape systems. ",(0,i.jsx)(t.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var i=n(96540);const s={},r=i.createContext(s);function l(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46c53b39.69f8ad0b.js b/assets/js/46c53b39.69f8ad0b.js deleted file mode 100644 index b081e62ae0..0000000000 --- a/assets/js/46c53b39.69f8ad0b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[406],{5284:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=t(74848),i=t(28453);const o={id:"developing_with_rucio",title:"Developing with Rucio"},s=void 0,a={id:"user/developing_with_rucio",title:"Developing with Rucio",description:"Rucio Clients",source:"@site/../docs/user/developing_with_rucio.md",sourceDirName:"user",slug:"/user/developing_with_rucio",permalink:"/documentation/user/developing_with_rucio",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/user/developing_with_rucio.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"developing_with_rucio",title:"Developing with Rucio"},sidebar:"docs",previous:{title:"UploadClient",permalink:"/documentation/client_api/uploadclient"},next:{title:"Setting up a Rucio demo environment",permalink:"/documentation/operator/setting_up_demo"}},l={},c=[{value:"Rucio Clients",id:"rucio-clients",level:2},{value:"Errors and Exceptions",id:"errors-and-exceptions",level:3},{value:"RESTful APIs",id:"restful-apis",level:2},{value:"Date format",id:"date-format",level:3},{value:"SSL only",id:"ssl-only",level:3},{value:"Response formats",id:"response-formats",level:3},{value:"Error handling",id:"error-handling",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"rucio-clients",children:"Rucio Clients"}),"\n",(0,r.jsx)(n.p,{children:"Rucio includes a client class to remove some of the complexity of dealing with\nraw HTTP requests against the RESTful API."}),"\n",(0,r.jsx)(n.p,{children:"All client methods are accessible through the high-level class Client. Below is\none example of using Rucio Client class:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"from rucio.client import Client\nrucio_client = Client()\nrucio_client.ping()\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The methods are separated per resource type. The API in full can be viewed\n",(0,r.jsx)(n.a,{href:"/client_api/accountclient",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"errors-and-exceptions",children:"Errors and Exceptions"}),"\n",(0,r.jsxs)(n.p,{children:["In the case of an error, Rucio returns a Python Exception with the appropriate\nTraceback, a detailed error string, and a unique error number. If the error\noccurred on the server side, it will be propagated to the client. The command\nline clients will exit back to the shell with the POSIX ",(0,r.jsx)(n.code,{children:"errno"})," of\nthe unique Rucio error number. The full and up to date list can be found in the\n",(0,r.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/lib/rucio/common/exception.py",children:"Exception\ndefinition"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"restful-apis",children:"RESTful APIs"}),"\n",(0,r.jsx)(n.p,{children:"Each resource can be accessed or modified using specially formed URLs and the\nstandard HTTP methods:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"GET to read\nPOST to create\nPUT to update\nDELETE to remove\n"})}),"\n",(0,r.jsxs)(n.p,{children:["We require that all requests are done over SSL. The API supports JSON\nformats. Rucio uses ",(0,r.jsx)(n.a,{href:"http://oauth.net/",children:"OAuth"})," to authenticate all API\nrequests. The method is to get an authentication token, and use it for the rest\nof the requests. Descriptions of the actions you may perform on each resource\ncan be found in the REST API documentation."]}),"\n",(0,r.jsx)(n.h3,{id:"date-format",children:"Date format"}),"\n",(0,r.jsxs)(n.p,{children:["All dates returned are in UTC and are strings in the following format (RFC 1123,\nex RFC 822): ",(0,r.jsx)(n.code,{children:"Mon, 13 May 2013 10:23:03 UTC"})]}),"\n",(0,r.jsx)(n.p,{children:"In code format, which can be used in all programming languages that support\nstrftime or strptime:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"%a, %d %b %Y %H:%M:%S UTC\n"})}),"\n",(0,r.jsx)(n.h3,{id:"ssl-only",children:"SSL only"}),"\n",(0,r.jsx)(n.p,{children:"We require that all requests(except for the ping) are done over SSL."}),"\n",(0,r.jsx)(n.h3,{id:"response-formats",children:"Response formats"}),"\n",(0,r.jsxs)(n.p,{children:["The currently-available response format for all REST endpoints is the\nstring-based format JavaScript Object Notation (",(0,r.jsx)(n.a,{href:"http://www.json.org/",children:"JSON"}),").\nThe server answer can be one of the following content-type in the http Header:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Content-type: application/json\nContent-Type: application/x-json-stream\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the last case, it corresponds to JSON objects delimited by newlines(streaming\nJSON for large answer), e.g.:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{ "id": 1, "foo": "bar" }\n{ "id": 2, "foo": "baz" }\n...\n'})}),"\n",(0,r.jsx)(n.h3,{id:"error-handling",children:"Error handling"}),"\n",(0,r.jsx)(n.p,{children:"Errors are returned using standard HTTP error code syntax. Additional info is\nincluded in the header or the body of the return call, JSON-formatted with the\nparameters:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"ExceptionClass\nExceptionMessage\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Where ",(0,r.jsx)(n.code,{children:"ExceptionClass"})," refers to Rucio Exceptions."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46c53b39.ce468163.js b/assets/js/46c53b39.ce468163.js new file mode 100644 index 0000000000..a65da8897e --- /dev/null +++ b/assets/js/46c53b39.ce468163.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[406],{5284:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=t(74848),i=t(28453);const o={id:"developing_with_rucio",title:"Developing with Rucio"},s=void 0,a={id:"user/developing_with_rucio",title:"Developing with Rucio",description:"Rucio Clients",source:"@site/../docs/user/developing_with_rucio.md",sourceDirName:"user",slug:"/user/developing_with_rucio",permalink:"/documentation/user/developing_with_rucio",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/user/developing_with_rucio.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"developing_with_rucio",title:"Developing with Rucio"},sidebar:"docs",previous:{title:"UploadClient",permalink:"/documentation/client_api/uploadclient"},next:{title:"Setting up a Rucio demo environment",permalink:"/documentation/operator/setting_up_demo"}},l={},c=[{value:"Rucio Clients",id:"rucio-clients",level:2},{value:"Errors and Exceptions",id:"errors-and-exceptions",level:3},{value:"RESTful APIs",id:"restful-apis",level:2},{value:"Date format",id:"date-format",level:3},{value:"SSL only",id:"ssl-only",level:3},{value:"Response formats",id:"response-formats",level:3},{value:"Error handling",id:"error-handling",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"rucio-clients",children:"Rucio Clients"}),"\n",(0,r.jsx)(n.p,{children:"Rucio includes a client class to remove some of the complexity of dealing with\nraw HTTP requests against the RESTful API."}),"\n",(0,r.jsx)(n.p,{children:"All client methods are accessible through the high-level class Client. Below is\none example of using Rucio Client class:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"from rucio.client import Client\nrucio_client = Client()\nrucio_client.ping()\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The methods are separated per resource type. The API in full can be viewed\n",(0,r.jsx)(n.a,{href:"/client_api/accountclient",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"errors-and-exceptions",children:"Errors and Exceptions"}),"\n",(0,r.jsxs)(n.p,{children:["In the case of an error, Rucio returns a Python Exception with the appropriate\nTraceback, a detailed error string, and a unique error number. If the error\noccurred on the server side, it will be propagated to the client. The command\nline clients will exit back to the shell with the POSIX ",(0,r.jsx)(n.code,{children:"errno"})," of\nthe unique Rucio error number. The full and up to date list can be found in the\n",(0,r.jsx)(n.a,{href:"https://github.com/rucio/rucio/blob/master/lib/rucio/common/exception.py",children:"Exception\ndefinition"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"restful-apis",children:"RESTful APIs"}),"\n",(0,r.jsx)(n.p,{children:"Each resource can be accessed or modified using specially formed URLs and the\nstandard HTTP methods:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"GET to read\nPOST to create\nPUT to update\nDELETE to remove\n"})}),"\n",(0,r.jsxs)(n.p,{children:["We require that all requests are done over SSL. The API supports JSON\nformats. Rucio uses ",(0,r.jsx)(n.a,{href:"http://oauth.net/",children:"OAuth"})," to authenticate all API\nrequests. The method is to get an authentication token, and use it for the rest\nof the requests. Descriptions of the actions you may perform on each resource\ncan be found in the REST API documentation."]}),"\n",(0,r.jsx)(n.h3,{id:"date-format",children:"Date format"}),"\n",(0,r.jsxs)(n.p,{children:["All dates returned are in UTC and are strings in the following format (RFC 1123,\nex RFC 822): ",(0,r.jsx)(n.code,{children:"Mon, 13 May 2013 10:23:03 UTC"})]}),"\n",(0,r.jsx)(n.p,{children:"In code format, which can be used in all programming languages that support\nstrftime or strptime:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"%a, %d %b %Y %H:%M:%S UTC\n"})}),"\n",(0,r.jsx)(n.h3,{id:"ssl-only",children:"SSL only"}),"\n",(0,r.jsx)(n.p,{children:"We require that all requests(except for the ping) are done over SSL."}),"\n",(0,r.jsx)(n.h3,{id:"response-formats",children:"Response formats"}),"\n",(0,r.jsxs)(n.p,{children:["The currently-available response format for all REST endpoints is the\nstring-based format JavaScript Object Notation (",(0,r.jsx)(n.a,{href:"http://www.json.org/",children:"JSON"}),").\nThe server answer can be one of the following content-type in the http Header:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Content-type: application/json\nContent-Type: application/x-json-stream\n"})}),"\n",(0,r.jsx)(n.p,{children:"In the last case, it corresponds to JSON objects delimited by newlines(streaming\nJSON for large answer), e.g.:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{ "id": 1, "foo": "bar" }\n{ "id": 2, "foo": "baz" }\n...\n'})}),"\n",(0,r.jsx)(n.h3,{id:"error-handling",children:"Error handling"}),"\n",(0,r.jsx)(n.p,{children:"Errors are returned using standard HTTP error code syntax. Additional info is\nincluded in the header or the body of the return call, JSON-formatted with the\nparameters:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"ExceptionClass\nExceptionMessage\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Where ",(0,r.jsx)(n.code,{children:"ExceptionClass"})," refers to Rucio Exceptions."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49aea3c1.592c2f87.js b/assets/js/49aea3c1.592c2f87.js new file mode 100644 index 0000000000..becb5a0fb3 --- /dev/null +++ b/assets/js/49aea3c1.592c2f87.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6880],{69313:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=n(74848),o=n(28453);const i={id:"what_is_rucio",title:"What is Rucio?"},s=void 0,r={id:"started/what_is_rucio",title:"What is Rucio?",description:"Rucio enables centralized management of large volumes of data backed by many",source:"@site/../docs/started/what_is_rucio.md",sourceDirName:"started",slug:"/started/what_is_rucio",permalink:"/documentation/started/what_is_rucio",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/what_is_rucio.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"what_is_rucio",title:"What is Rucio?"},sidebar:"docs",previous:{title:"Before you get started",permalink:"/documentation/started/before_you_get_started"},next:{title:"Main Components",permalink:"/documentation/started/main_components"}},c={},d=[{value:"History",id:"history",level:2},{value:"What can Rucio do",id:"what-can-rucio-do",level:2},{value:"What Rucio doesn't do",id:"what-rucio-doesnt-do",level:2}];function l(e){const t={h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Rucio enables centralized management of large volumes of data backed by many\nheterogeneous storage backends."}),"\n",(0,a.jsx)(t.p,{children:"Data is physically distributed over a large number of storage servers, potentially\neach relying on different storage technologies (SSD/Disk/Tape/Object storage) and,\nfrequently, managed by different teams of system administrators."}),"\n",(0,a.jsx)(t.p,{children:"Rucio builds on top of this heterogeneous infrastructure and provides an interface\nwhich allows users to interact with the storage backends in a unified way.\nThe smallest operational unit in Rucio is a file. Rucio enables users to upload,\ndownload, and declaratively manage groups of such files."}),"\n",(0,a.jsx)(t.p,{children:'Declarative management is the power of Rucio, as it allows the user to define\nhigh-level rules such as "Keep 3 copies, on 2 different continents".\nIf one copy is lost, it will be automatically re-constructed on a different storage\nserver to enforce the configured rules.'}),"\n",(0,a.jsx)(t.h2,{id:"history",children:"History"}),"\n",(0,a.jsxs)(t.p,{children:["Rucio was developed as a replacement for the Don Quijote (DQ2) data management\nsystem. Even if DQ2 has demonstrated very large scale data management capabilities,\nthe ",(0,a.jsx)(t.strong,{children:"ATLAS Distributed Data Management System"})," used for ",(0,a.jsx)(t.strong,{children:"HEP\nexperiments at CERN"})," had reached its limits in terms of scalability. The\nprimary concerns were"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"the requirement of a large number of support staff to operate."}),"\n",(0,a.jsx)(t.li,{children:"difficulty in interfacing with new technologies"}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["To address these very scaling requirements for HEP experiments, ",(0,a.jsx)(t.strong,{children:"Rucio"})," as a\nDistributed Data Management System, was developed. Drawing benefits from\nadvances in Cloud & Big Data computations, it relies on a conceptual data model\nto ensure system stability. Dataflow autonomy and automation are the key design\nprinciples guiding the development of Rucio. To reduce the operational overheads\nof the support staff, it employs an automation framework and also accounts for\nnewer use cases & user requirements in high energy physics and beyond."]}),"\n",(0,a.jsx)(t.h2,{id:"what-can-rucio-do",children:"What can Rucio do"}),"\n",(0,a.jsx)(t.p,{children:"The capabilities of Rucio are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Storage of detector data, simulator data, and user data"}),"\n",(0,a.jsx)(t.li,{children:"Unified interfacing of heterogenous network & storage infrastructure"}),"\n",(0,a.jsx)(t.li,{children:"Support for newer protocols in Storage & Network using plugins"}),"\n",(0,a.jsx)(t.li,{children:"Data Recovery"}),"\n",(0,a.jsx)(t.li,{children:"Adaptive Replication"}),"\n",(0,a.jsx)(t.li,{children:"Quota management"}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"what-rucio-doesnt-do",children:"What Rucio doesn't do"}),"\n",(0,a.jsx)(t.p,{children:"Rucio doesn't automatically create the storage backends. The storage servers must\nbe created and configured, in advance, with one of the supported access protocols\n(webdav/s3/sftp/xrootd/...), then configured in Rucio."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(96540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49aea3c1.f7102425.js b/assets/js/49aea3c1.f7102425.js deleted file mode 100644 index d5e65d7e17..0000000000 --- a/assets/js/49aea3c1.f7102425.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6880],{69313:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=n(74848),o=n(28453);const i={id:"what_is_rucio",title:"What is Rucio?"},s=void 0,r={id:"started/what_is_rucio",title:"What is Rucio?",description:"Rucio enables centralized management of large volumes of data backed by many",source:"@site/../docs/started/what_is_rucio.md",sourceDirName:"started",slug:"/started/what_is_rucio",permalink:"/documentation/started/what_is_rucio",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/started/what_is_rucio.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"what_is_rucio",title:"What is Rucio?"},sidebar:"docs",previous:{title:"Before you get started",permalink:"/documentation/started/before_you_get_started"},next:{title:"Main Components",permalink:"/documentation/started/main_components"}},c={},d=[{value:"History",id:"history",level:2},{value:"What can Rucio do",id:"what-can-rucio-do",level:2},{value:"What Rucio doesn't do",id:"what-rucio-doesnt-do",level:2}];function l(e){const t={h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Rucio enables centralized management of large volumes of data backed by many\nheterogeneous storage backends."}),"\n",(0,a.jsx)(t.p,{children:"Data is physically distributed over a large number of storage servers, potentially\neach relying on different storage technologies (SSD/Disk/Tape/Object storage) and,\nfrequently, managed by different teams of system administrators."}),"\n",(0,a.jsx)(t.p,{children:"Rucio builds on top of this heterogeneous infrastructure and provides an interface\nwhich allows users to interact with the storage backends in a unified way.\nThe smallest operational unit in Rucio is a file. Rucio enables users to upload,\ndownload, and declaratively manage groups of such files."}),"\n",(0,a.jsx)(t.p,{children:'Declarative management is the power of Rucio, as it allows the user to define\nhigh-level rules such as "Keep 3 copies, on 2 different continents".\nIf one copy is lost, it will be automatically re-constructed on a different storage\nserver to enforce the configured rules.'}),"\n",(0,a.jsx)(t.h2,{id:"history",children:"History"}),"\n",(0,a.jsxs)(t.p,{children:["Rucio was developed as a replacement for the Don Quijote (DQ2) data management\nsystem. Even if DQ2 has demonstrated very large scale data management capabilities,\nthe ",(0,a.jsx)(t.strong,{children:"ATLAS Distributed Data Management System"})," used for ",(0,a.jsx)(t.strong,{children:"HEP\nexperiments at CERN"})," had reached its limits in terms of scalability. The\nprimary concerns were"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"the requirement of a large number of support staff to operate."}),"\n",(0,a.jsx)(t.li,{children:"difficulty in interfacing with new technologies"}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["To address these very scaling requirements for HEP experiments, ",(0,a.jsx)(t.strong,{children:"Rucio"})," as a\nDistributed Data Management System, was developed. Drawing benefits from\nadvances in Cloud & Big Data computations, it relies on a conceptual data model\nto ensure system stability. Dataflow autonomy and automation are the key design\nprinciples guiding the development of Rucio. To reduce the operational overheads\nof the support staff, it employs an automation framework and also accounts for\nnewer use cases & user requirements in high energy physics and beyond."]}),"\n",(0,a.jsx)(t.h2,{id:"what-can-rucio-do",children:"What can Rucio do"}),"\n",(0,a.jsx)(t.p,{children:"The capabilities of Rucio are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Storage of detector data, simulator data, and user data"}),"\n",(0,a.jsx)(t.li,{children:"Unified interfacing of heterogenous network & storage infrastructure"}),"\n",(0,a.jsx)(t.li,{children:"Support for newer protocols in Storage & Network using plugins"}),"\n",(0,a.jsx)(t.li,{children:"Data Recovery"}),"\n",(0,a.jsx)(t.li,{children:"Adaptive Replication"}),"\n",(0,a.jsx)(t.li,{children:"Quota management"}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"what-rucio-doesnt-do",children:"What Rucio doesn't do"}),"\n",(0,a.jsx)(t.p,{children:"Rucio doesn't automatically create the storage backends. The storage servers must\nbe created and configured, in advance, with one of the supported access protocols\n(webdav/s3/sftp/xrootd/...), then configured in Rucio."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(96540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4b43413c.04491420.js b/assets/js/4b43413c.04491420.js new file mode 100644 index 0000000000..f1b771aa3f --- /dev/null +++ b/assets/js/4b43413c.04491420.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7541],{14102:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=s(74848),n=s(28453);const r={id:"notifications",title:"Notifications"},d=void 0,a={id:"operator/notifications",title:"Notifications",description:"Notifications",source:"@site/../docs/operator/notifications.md",sourceDirName:"operator",slug:"/operator/notifications",permalink:"/documentation/operator/notifications",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/notifications.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"notifications",title:"Notifications"},sidebar:"docs",previous:{title:"QoS RSE Configuration",permalink:"/documentation/operator/qos_rse_config"},next:{title:"rucio-abacus-account",permalink:"/documentation/bin/rucio-abacus-account"}},o={},c=[{value:"Notifications",id:"notifications",level:2},{value:"Rucio Notifications",id:"rucio-notifications",level:3}];function l(e){const t={code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"notifications",children:"Notifications"}),"\n",(0,i.jsx)(t.p,{children:"Rucio generates several types of notifications, such as for rule state changes, transfer requests, etc.\nThese notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted."}),"\n",(0,i.jsx)(t.h3,{id:"rucio-notifications",children:"Rucio Notifications"}),"\n",(0,i.jsx)(t.p,{children:"The events generated by Rucio are categorized into different event types. Each event type has a different payload."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Context"}),(0,i.jsx)(t.th,{children:"Event Type"}),(0,i.jsx)(t.th,{children:"Payload example"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"While adding a DID, if the DID type is a Container"}),(0,i.jsx)(t.td,{children:"CREATE_CNT"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"While adding a DID, if the DID type is a DataSet"}),(0,i.jsx)(t.td,{children:"CREATE_DTS"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Submit transfer requests on destination RSEs for data identifiers."}),(0,i.jsx)(t.td,{children:"transfer_status"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Schedule removal of the entry from the DIDs table"}),(0,i.jsx)(t.td,{children:"INCOMPLETE"}),(0,i.jsx)(t.td,{children:"-"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Delete empty DIDs where the DIDType is DATASET"}),(0,i.jsx)(t.td,{children:"ERASE"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for DIDs which are closed"}),(0,i.jsx)(t.td,{children:"RULE_OK"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"For replication replication rule, for each 10% of progress"}),(0,i.jsx)(t.td,{children:"RULE_PROGRESS"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for each DATASET covered by the rule"}),(0,i.jsx)(t.td,{children:"DATASETLOCK_OK"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a transfer has been completed"}),(0,i.jsx)(t.td,{children:"transfer-done"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a transfer has been fail"}),(0,i.jsx)(t.td,{children:"transfer-failed"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a deletion has been successful"}),(0,i.jsx)(t.td,{children:"deletion-done"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a deletion has been fail"}),(0,i.jsx)(t.td,{children:"deletion-failed"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>a});var i=s(96540);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4b43413c.a3b43dbb.js b/assets/js/4b43413c.a3b43dbb.js deleted file mode 100644 index 7471b87e69..0000000000 --- a/assets/js/4b43413c.a3b43dbb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7541],{14102:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=s(74848),n=s(28453);const r={id:"notifications",title:"Notifications"},d=void 0,a={id:"operator/notifications",title:"Notifications",description:"Notifications",source:"@site/../docs/operator/notifications.md",sourceDirName:"operator",slug:"/operator/notifications",permalink:"/documentation/operator/notifications",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/notifications.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"notifications",title:"Notifications"},sidebar:"docs",previous:{title:"QoS RSE Configuration",permalink:"/documentation/operator/qos_rse_config"},next:{title:"rucio-abacus-account",permalink:"/documentation/bin/rucio-abacus-account"}},o={},c=[{value:"Notifications",id:"notifications",level:2},{value:"Rucio Notifications",id:"rucio-notifications",level:3}];function l(e){const t={code:"code",h2:"h2",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"notifications",children:"Notifications"}),"\n",(0,i.jsx)(t.p,{children:"Rucio generates several types of notifications, such as for rule state changes, transfer requests, etc.\nThese notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted."}),"\n",(0,i.jsx)(t.h3,{id:"rucio-notifications",children:"Rucio Notifications"}),"\n",(0,i.jsx)(t.p,{children:"The events generated by Rucio are categorized into different event types. Each event type has a different payload."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Context"}),(0,i.jsx)(t.th,{children:"Event Type"}),(0,i.jsx)(t.th,{children:"Payload example"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"While adding a DID, if the DID type is a Container"}),(0,i.jsx)(t.td,{children:"CREATE_CNT"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"While adding a DID, if the DID type is a DataSet"}),(0,i.jsx)(t.td,{children:"CREATE_DTS"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Submit transfer requests on destination RSEs for data identifiers."}),(0,i.jsx)(t.td,{children:"transfer_status"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Schedule removal of the entry from the DIDs table"}),(0,i.jsx)(t.td,{children:"INCOMPLETE"}),(0,i.jsx)(t.td,{children:"-"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Delete empty DIDs where the DIDType is DATASET"}),(0,i.jsx)(t.td,{children:"ERASE"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for DIDs which are closed"}),(0,i.jsx)(t.td,{children:"RULE_OK"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"For replication replication rule, for each 10% of progress"}),(0,i.jsx)(t.td,{children:"RULE_PROGRESS"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When the replication rule transitioning into OK_STATE for each DATASET covered by the rule"}),(0,i.jsx)(t.td,{children:"DATASETLOCK_OK"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a transfer has been completed"}),(0,i.jsx)(t.td,{children:"transfer-done"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a transfer has been fail"}),(0,i.jsx)(t.td,{children:"transfer-failed"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a deletion has been successful"}),(0,i.jsx)(t.td,{children:"deletion-done"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"When a deletion has been fail"}),(0,i.jsx)(t.td,{children:"deletion-failed"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}"})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>a});var i=s(96540);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dae639c.73f77c28.js b/assets/js/4dae639c.73f77c28.js deleted file mode 100644 index 2e740ab5ff..0000000000 --- a/assets/js/4dae639c.73f77c28.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8236],{9605:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(74848),i=t(28453);const r={id:"project_organisation",title:"Project Organisation"},s=void 0,a={id:"project_organisation",title:"Project Organisation",description:"Rucio is organised as a community-driven, open-source, project.",source:"@site/../docs/project_organisation.md",sourceDirName:".",slug:"/project_organisation",permalink:"/documentation/project_organisation",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/project_organisation.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"project_organisation",title:"Project Organisation"},sidebar:"docs",previous:{title:"Developing the WebUI Frontend",permalink:"/documentation/developer/webui/webui_frontend"},next:{title:"Rucio Advisory Board",permalink:"/documentation/rucio_advisory_board"}},c={},d=[{value:"Project leader",id:"project-leader",level:2},{value:"Component leads",id:"component-leads",level:2},{value:"Rucio Advisory Board",id:"rucio-advisory-board",level:2},{value:"Special Interest Groups",id:"special-interest-groups",level:2},{value:"Contributors / Developers",id:"contributors--developers",level:2}];function l(e){const o={a:"a",h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"Rucio is organised as a community-driven, open-source, project.\nAn open development team, comprised of technical experts rooted in the scientific\ncommunity, drives the development based on expertise, technical best-practices and\ninput from their respective communities. This openness is core to the identity and\nthe success of the project."}),"\n",(0,n.jsx)(o.p,{children:"To organise the daily development work as well as the long-term strategic objectives\nof the software, the project consists of several entities described on this page."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Project organisation",src:t(72676).A+"",width:"936",height:"487"})}),"\n",(0,n.jsxs)(o.p,{children:['A list of members of the current "Core Team" can be seen ',(0,n.jsx)(o.a,{href:"https://rucio.cern.ch/team.html",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"project-leader",children:"Project leader"}),"\n",(0,n.jsx)(o.p,{children:"The project leader has the overall responsibility of steering the project. This\nincludes coordinating, planning, and assessing the development activity of the\nRucio developers."}),"\n",(0,n.jsx)(o.h2,{id:"component-leads",children:"Component leads"}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.a,{href:"/documentation/component_leads",children:"component leads"})," take formal responsibility in planning\nand developing contributions for their respective components. They are the\ncore experts and the point-of-contact in case of issues as well as to guide new\ndevelopments within their components."]}),"\n",(0,n.jsx)(o.h2,{id:"rucio-advisory-board",children:"Rucio Advisory Board"}),"\n",(0,n.jsx)(o.p,{children:"The primary function of the Rucio advisory board (RAB) is to provide expertise from\nrepresentatives of Rucio communities and to advise the Rucio project leader.\nLong-term priorities and plans of communities should be discussed by the RAB in order\nto advise on the alignment of Rucio project objectives and plans. This should also\nlead to the identification of common objectives to form common development efforts.\nThe resource and person-power situation within the Rucio project, the discussion and\nidentification of funding streams and collaboration on funded projects are also\nwithin the scope of the RAB. The Rucio project lead communicates the advice given by\nthe advisory board to the development team."}),"\n",(0,n.jsxs)(o.p,{children:["Detailed mandate and responsibility of the board can be found ",(0,n.jsx)(o.a,{href:"/documentation/rucio_advisory_board",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"special-interest-groups",children:"Special Interest Groups"}),"\n",(0,n.jsx)(o.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,n.jsxs)(o.p,{children:["Detailed information for Rucio SIGs can be found ",(0,n.jsx)(o.a,{href:"/documentation/special_interest_groups",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"contributors--developers",children:"Contributors / Developers"}),"\n",(0,n.jsxs)(o.p,{children:["Rucio could not exist without the numerous contributors who spent their valuable time\nto improve the software. A list of contributors can be seen ",(0,n.jsx)(o.a,{href:"about_our_contributors",children:"here"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},72676:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/project_organisation-26f4ec9e8a458f3a02eed817081da17c.svg"},28453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(96540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dae639c.84471a14.js b/assets/js/4dae639c.84471a14.js new file mode 100644 index 0000000000..70c5e6d376 --- /dev/null +++ b/assets/js/4dae639c.84471a14.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8236],{9605:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(74848),i=t(28453);const r={id:"project_organisation",title:"Project Organisation"},s=void 0,a={id:"project_organisation",title:"Project Organisation",description:"Rucio is organised as a community-driven, open-source, project.",source:"@site/../docs/project_organisation.md",sourceDirName:".",slug:"/project_organisation",permalink:"/documentation/project_organisation",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/project_organisation.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"project_organisation",title:"Project Organisation"},sidebar:"docs",previous:{title:"Developing the WebUI Frontend",permalink:"/documentation/developer/webui/webui_frontend"},next:{title:"Rucio Advisory Board",permalink:"/documentation/rucio_advisory_board"}},c={},d=[{value:"Project leader",id:"project-leader",level:2},{value:"Component leads",id:"component-leads",level:2},{value:"Rucio Advisory Board",id:"rucio-advisory-board",level:2},{value:"Special Interest Groups",id:"special-interest-groups",level:2},{value:"Contributors / Developers",id:"contributors--developers",level:2}];function l(e){const o={a:"a",h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"Rucio is organised as a community-driven, open-source, project.\nAn open development team, comprised of technical experts rooted in the scientific\ncommunity, drives the development based on expertise, technical best-practices and\ninput from their respective communities. This openness is core to the identity and\nthe success of the project."}),"\n",(0,n.jsx)(o.p,{children:"To organise the daily development work as well as the long-term strategic objectives\nof the software, the project consists of several entities described on this page."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Project organisation",src:t(72676).A+"",width:"936",height:"487"})}),"\n",(0,n.jsxs)(o.p,{children:['A list of members of the current "Core Team" can be seen ',(0,n.jsx)(o.a,{href:"https://rucio.cern.ch/team.html",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"project-leader",children:"Project leader"}),"\n",(0,n.jsx)(o.p,{children:"The project leader has the overall responsibility of steering the project. This\nincludes coordinating, planning, and assessing the development activity of the\nRucio developers."}),"\n",(0,n.jsx)(o.h2,{id:"component-leads",children:"Component leads"}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.a,{href:"/documentation/component_leads",children:"component leads"})," take formal responsibility in planning\nand developing contributions for their respective components. They are the\ncore experts and the point-of-contact in case of issues as well as to guide new\ndevelopments within their components."]}),"\n",(0,n.jsx)(o.h2,{id:"rucio-advisory-board",children:"Rucio Advisory Board"}),"\n",(0,n.jsx)(o.p,{children:"The primary function of the Rucio advisory board (RAB) is to provide expertise from\nrepresentatives of Rucio communities and to advise the Rucio project leader.\nLong-term priorities and plans of communities should be discussed by the RAB in order\nto advise on the alignment of Rucio project objectives and plans. This should also\nlead to the identification of common objectives to form common development efforts.\nThe resource and person-power situation within the Rucio project, the discussion and\nidentification of funding streams and collaboration on funded projects are also\nwithin the scope of the RAB. The Rucio project lead communicates the advice given by\nthe advisory board to the development team."}),"\n",(0,n.jsxs)(o.p,{children:["Detailed mandate and responsibility of the board can be found ",(0,n.jsx)(o.a,{href:"/documentation/rucio_advisory_board",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"special-interest-groups",children:"Special Interest Groups"}),"\n",(0,n.jsx)(o.p,{children:"Rucio Special Interest Groups (SIG) serve the purpose to offer a forum for interested users,\noperators, and developers to discuss and plan the evolution of a specific part of Rucio.\nThe topic of a SIG needs to be well-defined and the community interest on the topic\nneeds to be above a threshold to justify the creation of a SIG, instead of covering the\ntopic just within the weekly Rucio meeting. A SIG topic can involve one or multiple\nRucio components, or even the entire system. SIGs are open to any interrested community\nmember."}),"\n",(0,n.jsxs)(o.p,{children:["Detailed information for Rucio SIGs can be found ",(0,n.jsx)(o.a,{href:"/documentation/special_interest_groups",children:"here"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"contributors--developers",children:"Contributors / Developers"}),"\n",(0,n.jsxs)(o.p,{children:["Rucio could not exist without the numerous contributors who spent their valuable time\nto improve the software. A list of contributors can be seen ",(0,n.jsx)(o.a,{href:"about_our_contributors",children:"here"}),"."]})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},72676:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/project_organisation-26f4ec9e8a458f3a02eed817081da17c.svg"},28453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(96540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a310bfb.0a5e2e86.js b/assets/js/5a310bfb.0a5e2e86.js new file mode 100644 index 0000000000..9022abb205 --- /dev/null +++ b/assets/js/5a310bfb.0a5e2e86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[511],{23024:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=n(74848),r=n(28453);const o={id:"kubernetes",title:"Setting up Rucio on Kubernetes"},a=void 0,s={id:"operator/kubernetes",title:"Setting up Rucio on Kubernetes",description:"Helm charts",source:"@site/../docs/operator/kubernetes.md",sourceDirName:"operator",slug:"/operator/kubernetes",permalink:"/documentation/operator/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/kubernetes.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"kubernetes",title:"Setting up Rucio on Kubernetes"},sidebar:"docs",previous:{title:"Setting up a Rucio demo environment",permalink:"/documentation/operator/setting_up_demo"},next:{title:"Installing Rucio Server",permalink:"/documentation/operator/installing_server"}},c={},l=[{value:"Helm charts",id:"helm-charts",level:2},{value:"Tutorial",id:"tutorial",level:2},{value:"Example of Kubernetes deployment",id:"example-of-kubernetes-deployment",level:2},{value:"Bootstrapping the database",id:"bootstrapping-the-database",level:2},{value:"Upgrading the database",id:"upgrading-the-database",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"helm-charts",children:"Helm charts"}),"\n",(0,i.jsxs)(t.p,{children:["Helm charts help you define, install, and upgrade Kubernetes applications. In ",(0,i.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"this repository"}),", you can find Helm charts for the major different components of Rucio."]}),"\n",(0,i.jsx)(t.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,i.jsxs)(t.p,{children:["A tutorial for using Rucio with Kubernetes can be found ",(0,i.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"here"})]}),"\n",(0,i.jsx)(t.h2,{id:"example-of-kubernetes-deployment",children:"Example of Kubernetes deployment"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"https://www.km3net.org",children:"KM3NeT"})," runs Rucio on Kubernetes via ",(0,i.jsx)(t.a,{href:"https://fluxcd.io",children:"flux"}),".\nThe configuration deployed on their Rucio server can be found ",(0,i.jsx)(t.a,{href:"https://git.km3net.de/rucio/rucio-deployment",children:"here"}),".\nThe documentation of how this (specific) instance can be set up can be found in the ",(0,i.jsx)(t.a,{href:"https://rucio.pages.km3net.de/rucio-documentation/installation/",children:"docs"})]}),"\n",(0,i.jsx)(t.h2,{id:"bootstrapping-the-database",children:"Bootstrapping the database"}),"\n",(0,i.jsx)(t.p,{children:"By default, no database is initialized when a new Rucio installation is set up.\nAn init container can be used to bootstrap the database on a Kubernetes cluster:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Create a ",(0,i.jsx)(t.code,{children:"init-pod.yaml"})," file as in the snippet below, replacing the ",(0,i.jsx)(t.code,{children:""})," with the secret needed to connect to the database:"]}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Pod\nmetadata:\n name: init\n labels:\n app: rucio\nspec:\n restartPolicy: Never\n containers:\n - name: init\n image: rucio/rucio-init:latest\n imagePullPolicy: Always\n env:\n - name: RUCIO_CFG_DATABASE_DEFAULT\n value: postgresql://rucio:@postgres-postgresql/rucio\n - name: RUCIO_CFG_DATABASE_SCHEMA\n value: test\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_IDENTITY\n value: tutorial\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_PWD\n value: secret1R\n - name: RUCIO_PRINT_CFG\n value: "true"\n'})}),"\n",(0,i.jsxs)(t.ol,{start:"2",children:["\n",(0,i.jsx)(t.li,{children:"Start the init pod:"}),"\n"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"kubectl apply -f init-pod.yaml\n"})}),"\n",(0,i.jsx)(t.p,{children:"For more information:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"Rucio Kubernetes tutorial repository README"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",children:"Init container documentation"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"upgrading-the-database",children:"Upgrading the database"}),"\n",(0,i.jsxs)(t.p,{children:["After the Rucio version has been upgraded, there might be database changes\nthat have to be done. These can be done on the ",(0,i.jsx)(t.code,{children:"rucio-server"})," pod of the cluster and\nare performed with the ",(0,i.jsx)(t.a,{href:"http://alembic.zzzcomputing.com/en/latest/",children:"Alembic"})," tool."]}),"\n",(0,i.jsxs)(t.p,{children:["The alembic.ini template can be found\n",(0,i.jsx)(t.a,{href:"https://github.com/rucio/rucio/blob/master/etc/alembic.ini.template",children:"here"}),".\nFill in the correct values before transferring the file to the ",(0,i.jsx)(t.code,{children:"rucio-server"})," pod:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"cat alembic.ini | kubectl exec -i rucio-server- --container rucio-server -- tee /tmp/alembic.ini\n"})}),"\n",(0,i.jsx)(t.p,{children:"Open a bash prompt on the pod"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"kubectl exec rucio-server- --container rucio-server -it -- bash\n"})}),"\n",(0,i.jsxs)(t.p,{children:["Then perform the upgrade with the Alembic tool as described in the database ",(0,i.jsx)(t.a,{href:"./database#upgrading-and-downgrading-the-database-schema",children:"documentation"})]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(96540);const r={},o=i.createContext(r);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a310bfb.47e63880.js b/assets/js/5a310bfb.47e63880.js deleted file mode 100644 index f714cc230b..0000000000 --- a/assets/js/5a310bfb.47e63880.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[511],{23024:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(74848),i=n(28453);const o={id:"kubernetes",title:"Setting up Rucio on Kubernetes"},a=void 0,s={id:"operator/kubernetes",title:"Setting up Rucio on Kubernetes",description:"Helm charts",source:"@site/../docs/operator/kubernetes.md",sourceDirName:"operator",slug:"/operator/kubernetes",permalink:"/documentation/operator/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/operator/kubernetes.md",tags:[],version:"current",lastUpdatedBy:"voetberg",lastUpdatedAt:1729244232e3,frontMatter:{id:"kubernetes",title:"Setting up Rucio on Kubernetes"},sidebar:"docs",previous:{title:"Setting up a Rucio demo environment",permalink:"/documentation/operator/setting_up_demo"},next:{title:"Installing Rucio Server",permalink:"/documentation/operator/installing_server"}},c={},l=[{value:"Helm charts",id:"helm-charts",level:2},{value:"Tutorial",id:"tutorial",level:2},{value:"Example of Kubernetes deployment",id:"example-of-kubernetes-deployment",level:2},{value:"Bootstrapping the database",id:"bootstrapping-the-database",level:2},{value:"Upgrading the database",id:"upgrading-the-database",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"helm-charts",children:"Helm charts"}),"\n",(0,r.jsxs)(t.p,{children:["Helm charts help you define, install, and upgrade Kubernetes applications. In ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/helm-charts",children:"this repository"}),", you can find Helm charts for the major different components of Rucio."]}),"\n",(0,r.jsx)(t.h2,{id:"tutorial",children:"Tutorial"}),"\n",(0,r.jsxs)(t.p,{children:["A tutorial for using Rucio with Kubernetes can be found ",(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"here"})]}),"\n",(0,r.jsx)(t.h2,{id:"example-of-kubernetes-deployment",children:"Example of Kubernetes deployment"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://www.km3net.org",children:"KM3NeT"})," runs Rucio on Kubernetes via ",(0,r.jsx)(t.a,{href:"https://fluxcd.io",children:"flux"}),".\nThe configuration deployed on their Rucio server can be found ",(0,r.jsx)(t.a,{href:"https://git.km3net.de/rucio/rucio-deployment",children:"here"}),".\nThe documentation of how this (specific) instance can be set up can be found in the ",(0,r.jsx)(t.a,{href:"https://rucio.pages.km3net.de/rucio-documentation/installation/",children:"docs"})]}),"\n",(0,r.jsx)(t.h2,{id:"bootstrapping-the-database",children:"Bootstrapping the database"}),"\n",(0,r.jsx)(t.p,{children:"By default, no database is initialized when a new Rucio installation is set up.\nAn init container can be used to bootstrap the database on a Kubernetes cluster:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Create a ",(0,r.jsx)(t.code,{children:"init-pod.yaml"})," file as in the snippet below, replacing the ",(0,r.jsx)(t.code,{children:""})," with the secret needed to connect to the database:"]}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'apiVersion: v1\nkind: Pod\nmetadata:\n name: init\n labels:\n app: rucio\nspec:\n restartPolicy: Never\n containers:\n - name: init\n image: rucio/rucio-init:latest\n imagePullPolicy: Always\n env:\n - name: RUCIO_CFG_DATABASE_DEFAULT\n value: postgresql://rucio:@postgres-postgresql/rucio\n - name: RUCIO_CFG_DATABASE_SCHEMA\n value: test\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_IDENTITY\n value: tutorial\n - name: RUCIO_CFG_BOOTSTRAP_USERPASS_PWD\n value: secret1R\n - name: RUCIO_PRINT_CFG\n value: "true"\n'})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsx)(t.li,{children:"Start the init pod:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl apply -f init-pod.yaml\n"})}),"\n",(0,r.jsx)(t.p,{children:"For more information:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://github.com/rucio/k8s-tutorial/blob/master/README.md",children:"Rucio Kubernetes tutorial repository README"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/",children:"Init container documentation"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"upgrading-the-database",children:"Upgrading the database"}),"\n",(0,r.jsxs)(t.p,{children:["After the Rucio version has been upgraded, there might be database changes\nthat have to be done. These can be done on the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod of the cluster and\nare performed with the ",(0,r.jsx)(t.a,{href:"http://alembic.zzzcomputing.com/en/latest/",children:"Alembic"})," tool."]}),"\n",(0,r.jsxs)(t.p,{children:["The alembic.ini template can be found\n",(0,r.jsx)(t.a,{href:"https://github.com/rucio/rucio/blob/master/etc/alembic.ini.template",children:"here"}),".\nFill in the correct values before transferring the file to the ",(0,r.jsx)(t.code,{children:"rucio-server"})," pod:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"cat alembic.ini | kubectl exec -i rucio-server- --container rucio-server -- tee /tmp/alembic.ini\n"})}),"\n",(0,r.jsx)(t.p,{children:"Open a bash prompt on the pod"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"kubectl exec rucio-server- --container rucio-server -it -- bash\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Then perform the upgrade with the Alembic tool as described in the database ",(0,r.jsx)(t.a,{href:"./database#upgrading-and-downgrading-the-database-schema",children:"documentation"})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var r=n(96540);const i={},o=r.createContext(i);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a5d0baa.426babe9.js b/assets/js/5a5d0baa.426babe9.js new file mode 100644 index 0000000000..2091a85cf9 --- /dev/null +++ b/assets/js/5a5d0baa.426babe9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1526],{30818:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var s=t(74848),i=t(28453);const o={id:"webui_frontend",title:"Developing the WebUI Frontend"},a=void 0,r={id:"developer/webui/webui_frontend",title:"Developing the WebUI Frontend",description:"Notes on external frameworks",source:"@site/../docs/developer/webui/webui_frontend.md",sourceDirName:"developer/webui",slug:"/developer/webui/webui_frontend",permalink:"/documentation/developer/webui/webui_frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/rucio/documentation/tree/main/docs/../docs/developer/webui/webui_frontend.md",tags:[],version:"current",lastUpdatedBy:"Riccardo Di Maio",lastUpdatedAt:1729356917e3,frontMatter:{id:"webui_frontend",title:"Developing the WebUI Frontend"},sidebar:"docs",previous:{title:"Using the WebUI StreamedTable Component",permalink:"/documentation/developer/webui/streamedtables"},next:{title:"Project Organisation",permalink:"/documentation/project_organisation"}},l={},d=[{value:"Notes on external frameworks",id:"notes-on-external-frameworks",level:2},{value:"React",id:"react",level:3},{value:"Components",id:"components",level:4},{value:"Attributes",id:"attributes",level:4},{value:"className",id:"classname",level:5},{value:"PageProps",id:"pageprops",level:5},{value:"aria",id:"aria",level:5},{value:"Hooks",id:"hooks",level:4},{value:"useState",id:"usestate",level:5},{value:"useEffect",id:"useeffect",level:5},{value:"useComDOM",id:"usecomdom",level:5},{value:"useResponsiveHook",id:"useresponsivehook",level:5},{value:"Tailwind",id:"tailwind",level:3},{value:"Structuring Class Names, Overriding",id:"structuring-class-names-overriding",level:4},{value:"Responsive Design",id:"responsive-design",level:4},{value:"Compiling Tailwind",id:"compiling-tailwind",level:4},{value:"Storybook",id:"storybook",level:3},{value:"Fixtures",id:"fixtures",level:5},{value:"mockUseComDOM",id:"mockusecomdom",level:5}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"notes-on-external-frameworks",children:"Notes on external frameworks"}),"\n",(0,s.jsxs)(n.p,{children:["The Rucio WebUI frontend uses two main frameworks: ",(0,s.jsx)(n.a,{href:"https://tailwindcss.com/",children:"TailwindCSS"}),"\nand ",(0,s.jsx)(n.a,{href:"https://react.dev/learn",children:"React"}),". Both have excellent documentations, which I will\nnot attempt to replace with these notes. Instead, I will extend them and concretise them\nwith the focus on the Rucio WebUI frontend and the design that it entails."]}),"\n",(0,s.jsxs)(n.p,{children:["Nonetheless, I will do a quick rundown of the most important and most frequently used\naspects of both frameworks in order to save a new developer time. In the end, I will also\nintroduce ",(0,s.jsx)(n.a,{href:"https://storybook.js.org/",children:"StorybookJS"}),", which is our tool to visualise the\nindividual tools of our website."]}),"\n",(0,s.jsx)(n.h3,{id:"react",children:"React"}),"\n",(0,s.jsx)(n.p,{children:"We use React as our frontend JavaScript framework. It is essentially a tool for building UI\ncomponents."}),"\n",(0,s.jsx)(n.h4,{id:"components",children:"Components"}),"\n",(0,s.jsx)(n.p,{children:"The building-blocks of our webpages are React Components. The webpages themselves are React\nComponents themselves. Individual components can be composed with each other to produce\nmore complex components, in the sense that a button component can be used to populate a\nwidget which is then used in a page."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"The Rucio WebUI is written in TypeScript. In these docs, JavaScript and TypeScript might\nbe used interchangeably."})}),"\n",(0,s.jsxs)(n.p,{children:["These components JavaScript functions which return HTML code. We use ",(0,s.jsx)(n.code,{children:".tsx"})," files, which mean\nthat HTML markup and TypeScript code can be used in the same file. This can take the following\nshape:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'export const H1: React.FC = (\n { ...props }\n) => {\n const { children, className, ...otherprops } = props;\n return (\n \n {children}\n \n )\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Several things are going on here. The overall structure, however, is that of an\narrow function ",(0,s.jsx)(n.code,{children:"() => {}"})," returning an HTML tag of the shape\n",(0,s.jsx)(n.code,{children:"

    something

    "})," is defined and assigned to ",(0,s.jsx)(n.code,{children:"const H1"}),". The arrow function\nis typed, this will be handled later."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["In TSX, HTML markup is inserted into TypeScript after a ",(0,s.jsx)(n.code,{children:"return"})," statement.\nTypeScript is inserted into HTML when wrapped in ",(0,s.jsx)(n.code,{children:"{}"}),". VS Code does proper\nsyntax highlighting, which will help out."]})}),"\n",(0,s.jsx)(n.p,{children:"This function can now be imported and called in the following way:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"

    Hello world!

    \n// more or less equal to\n

    Hello world!

    \n"})}),"\n",(0,s.jsx)(n.p,{children:"When using React components, take note of the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Custom components must start with a capital letter."}),"\n",(0,s.jsx)(n.li,{children:"You must return only one top-level HTML tag. You may nest other tags within this one."}),"\n",(0,s.jsx)(n.li,{children:"React components can nest other react components. They must ultimately resolve to HTML, though."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In our components, we usually make sure to typecast the functions as React Function Components.\nThese can in turn be cast to take the attributes of a specific HTML tag, which is chosen\nto be the top-level HTML tag returned."}),"\n",(0,s.jsxs)(n.p,{children:["In the following example, we define a type ",(0,s.jsx)(n.code,{children:"TextInputProps"})," which combines the\nattributes of the ",(0,s.jsx)(n.code,{children:""}),"-tag (all of which are optional) with the\n",(0,s.jsx)(n.code,{children:"onEnterkey?"})," attribute (the ",(0,s.jsx)(n.code,{children:"?"})," signifies that this is an optional attribute). The\nresulting component can take any of these attributes."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that the ",(0,s.jsx)(n.code,{children:"...props"})," syntax simply means that any parameters ",(0,s.jsx)(n.code,{children:""}),"\npassed to the component that are not ",(0,s.jsx)(n.code,{children:"onEnterkey"})," are swallowed by the ",(0,s.jsx)(n.code,{children:"props"})," object."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'type TextInputProps = JSX.IntrinsicElements["input"] & {\n onEnterkey?: (event: any) => void,\n}\n\nexport const TextInput: (\n React.FC\n) = (\n {\n onEnterkey,\n ...props\n }\n) => {\n // shown in next code example\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Typing our components this way means that we can easily extend standard HTML tags, while keeping\nall of their original functionality (i.e. the way they deal with attributes passed to them) ",(0,s.jsx)(n.em,{children:"without"}),"\nthe need to implement each attribute ourselves."]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsxs)(n.p,{children:["These attributes are referred to as ",(0,s.jsx)(n.em,{children:"content attributes"})," and it is a very good idea to get\nacquainted with the different attributes that can be assigned to the different HTML tags.\nWe will cover some examples in the next section. You can find more information here:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://html.spec.whatwg.org/",children:"HTML Specification"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes",children:"MDN Web Docs"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.w3schools.com/tags/ref_attributes.asp",children:"W3Schools"})}),"\n"]})]}),"\n",(0,s.jsxs)(n.p,{children:["Finally, you can pass these attributes into the component state (usually done\nwith components that render pages), or pass them into the sub-components that\nmake up the component. The latter is what happens in the following code block,\nwhich is taken from ",(0,s.jsx)(n.code,{children:"TextInput"})," again:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'// unpack props props to be handled individually and otherprops\nconst { children, onKeyDown, ...otherprops } = props\nreturn (\n {\n if (e.key === "Enter") {\n // `?.()`-syntax used because onEnterkey could be undefined\n onEnterkey?.(e)\n }\n // could also be undefined\n onKeyDown?.(e)\n }}\n {...otherprops} // unpack otherprops here\n >\n {\n // pass the content between in here\n children\n }\n \n)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["In the previous example, a native HTML tag has been enriched by the ",(0,s.jsx)(n.code,{children:"onKeyDown"})," function\nby a special ",(0,s.jsx)(n.code,{children:"onEnterkey"})," functionality. In all other ways, the new component is the same\nas the included, standard ",(0,s.jsx)(n.code,{children:""})," tag."]}),"\n",(0,s.jsx)(n.h4,{id:"attributes",children:"Attributes"}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["React will rename some of the component attributes. An example of this is the\n",(0,s.jsx)(n.code,{children:"className"}),"-attribute, which replaces the native HTML keyword ",(0,s.jsx)(n.code,{children:"class"}),". This is\ndone to prevent namespace clashes."]})}),"\n",(0,s.jsx)(n.h5,{id:"classname",children:"className"}),"\n",(0,s.jsxs)(n.p,{children:["A more detailed description of how we style our components will follow in the\nTailwind-section. The important concept is that we assign classes to each component,\nand these classes are then used as selectors to apply certain styles to the the component.\nClasses are assigned to the ",(0,s.jsx)(n.code,{children:"className"})," attribute as space-separated strings."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'\n Hi\n

    \n'})}),"\n",(0,s.jsxs)(n.p,{children:["We often make use of the ",(0,s.jsx)(n.code,{children:"twMerge"})," function. This function swallows all string arguments\nand returns a single class string. Importantly, classes added later may override those added\nbefore them, which is not the case when we do not use ",(0,s.jsx)(n.code,{children:"twMerge"}),". An example of this\nis seen in the followin code-block."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:'\n'})}),"\n",(0,s.jsxs)(n.p,{children:["It is a good idea to use ",(0,s.jsx)(n.code,{children:"twMerge"})," wherever the class definition contains conditionals,\noverrides, or is so long that it would span multiple lines."]}),"\n",(0,s.jsx)(n.h5,{id:"pageprops",children:"PageProps"}),"\n",(0,s.jsx)(n.p,{children:"The highest-level components produced in the frontend are the pages. Remember\nthat a component is a function that returns HTML. The input of these functions\ncan be quite complex, especially for the highest-level components, which combine\na lot of data from different sources."}),"\n",(0,s.jsxs)(n.p,{children:["In the following example, we define an interface for the ",(0,s.jsx)(n.code,{children:"ListDID"})," page. Note\nthat input to the page is given in the form of a ",(0,s.jsx)(n.code,{children:"ViewModel"})," (",(0,s.jsx)(n.code,{children:"DIDViewModel"}),",\n",(0,s.jsx)(n.code,{children:"DIDMetaViewModel"}),"), while the functions are for the page to communicate to\ndeeper-lying components."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-tsx",children:"export interface ListDIDPageProps {\n comdom: UseComDOM, // this ViewModel comes in a stream, more later.\n didQuery: (query: string, type: DIDType) => void,\n didMetaQuery: (scope: string, name: string) => void,\n didMetaQueryResponse: DIDMetaViewModel,\n}\n\nexport const ListDID = (\n props: ListDIDPageProps\n) => {\n // ...\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We do not want the frontend to handle any fetches or streams itself, hence the\nfunctions ",(0,s.jsx)(n.code,{children:"didQuery"})," and ",(0,s.jsx)(n.code,{children:"didMetaQuery"})," (which start a stream and query\nmetadata, respectively) are defined outside of the component and only passed to\nit. It also means that the page can be run even without a backend attached to\nit, we simply replace these functions with dummies (and the ViewModels with fake\ndata)."]}),"\n",(0,s.jsx)(n.h5,{id:"aria",children:"aria"}),"\n",(0,s.jsxs)(n.p,{children:["ARIA stands for ",(0,s.jsx)(n.a,{href:"https://www.w3.org/TR/html-aria/",children:"Accessible Rich Internet Applications"}),"\nand defines the standard for how to make a web application accessible to users that\nare somehow impaired. One way of making the website more accessible is the conscious inclusion of\nARIA-attributes."]}),"\n",(0,s.jsxs)(n.p,{children:["A simple but common example would be adding an ARIA-label to an element which would\notherwise only be described by an icon/glyph. Note that screen-readers give priority\nto semantic ",(0,s.jsx)(n.code,{children:"
    ComponentLead (+Deputies)Description
    Authentication & AuthorisationDimitrios Christidis, Mario LassnigClient-server authentication, Rucio tokens, auth methods (kerberos, ssh, userpass, OIDC, ...)
    ClientsMaggie Voetberg, Mario LassnigGeneral Python Clients and Command Line interface related development, rucio download, rucio upload; Specific component related client functionality is part of the other components
    Consistency checksFabio Luchetti, Guilherme LimaDark data detection daemon: Auditor
    Core & InternalsMartin Barisits, Mario LassnigCore functionality not specifically part of other components
    DatabaseDimitrios Xenakis, Mario Lassnig, Martin BarisitsDatabase (Compatibility and optimisation) and SQLAlchemy framework specific issues
    Dataset deletionAlexander Richards, Martin BarisitsDataset deletion daemon: Undertaker
    DeletionHugo Gonzalez Labrador, Cedric SerfonFile deletion daemon: Reaper
    DIRACCedric SerfonRucio integration with Dirac
    Docker & KubernetesRiccardo Di Maio, Mario Lassnig, Eric Vaandering, Hugo Gonzalez LabradorDocker & Kubernetes deployment
    DocumentationMartin Barisits, Maggie VoetbergGeneral documentation
    Jupyterlab extensionFrancesc Torradeflot, Enrique Garcia GarciaRucio Jupyterlab extension
    Life time modelDimitrios ChristidisLife time model processing and exceptions
    MessagingAlexander Richards, Mario LassnigMessaging daemon: Hermes, Creation of eMails and ActiveMQ messages
    MetadataRob Barnsley, Dimitrios XenakisMetadata workflows
    Monitoring & TracesMayank Sharma, Mario LassnigAll things internal monitoring and traces
    Multi VOTim NobleIssues and developments related to Rucio Multi VO mode
    PoliciesJames PerryAll things related to separate settings/config/policies into community specific things
    Probes & AlarmsDimitrios Christidis, Eric VaanderingProbes and alarms for Nagios
    ProtocolsMaggie Voetberg, Mario LassnigProtocols (Upload, Download, Deletion)
    RebalancingCedric SerfonData rebalancing daemon: BB8
    RecoveryCedric SerfonData recovery daemon: Necromancer and suspicious replica recovery
    Release managementMartin Barisits, Dimitrios ChristidisPackaging of new versions, package configuration
    ReplicasRiccardo Di Maio, Alexander RichardsReplicas related workflows (list_replicas, add_replica, ...)
    REST & APIMaggie Voetberg, Martin BarisitsWeb-Framework (Web.py & Flask)
    RulesRiccardo Di Maio, Martin BarisitsReplication rules and rule daemons: Judge
    SubscriptionsCedric SerfonSubscription daemon: Transmogrifier
    TestingMayank Sharma, Riccardo Di MaioRegression and Unit tests, automatic tests of submissions
    TransfersRiccardo Di Maio, Hugo Gonzalez LabradorTransfer daemons: conveyor and functional transfer tests
    WebUIMayank Sharma, Eraldo Silva JuniorWeb user interface: Rucio Web UI
    +
    ComponentLead (+Deputies)Description
    Authentication & AuthorisationDimitrios Christidis, Mario LassnigClient-server authentication, Rucio tokens, auth methods (kerberos, ssh, userpass, OIDC, ...)
    ClientsMaggie Voetberg, Mario LassnigGeneral Python Clients and Command Line interface related development, rucio download, rucio upload; Specific component related client functionality is part of the other components
    Consistency checksFabio Luchetti, Guilherme LimaDark data detection daemon: Auditor
    Core & InternalsMartin Barisits, Mario LassnigCore functionality not specifically part of other components
    DatabaseDimitrios Xenakis, Mario Lassnig, Martin BarisitsDatabase (Compatibility and optimisation) and SQLAlchemy framework specific issues
    Dataset deletionAlexander Richards, Martin BarisitsDataset deletion daemon: Undertaker
    DeletionHugo Gonzalez Labrador, Cedric SerfonFile deletion daemon: Reaper
    DIRACCedric SerfonRucio integration with Dirac
    Docker & KubernetesRiccardo Di Maio, Mario Lassnig, Eric Vaandering, Hugo Gonzalez LabradorDocker & Kubernetes deployment
    DocumentationMartin Barisits, Maggie VoetbergGeneral documentation
    Jupyterlab extensionFrancesc Torradeflot, Enrique Garcia GarciaRucio Jupyterlab extension
    Life time modelDimitrios ChristidisLife time model processing and exceptions
    MessagingAlexander Richards, Mario LassnigMessaging daemon: Hermes, Creation of eMails and ActiveMQ messages
    MetadataRob Barnsley, Dimitrios XenakisMetadata workflows
    Monitoring & TracesMayank Sharma, Mario LassnigAll things internal monitoring and traces
    Multi VOTim NobleIssues and developments related to Rucio Multi VO mode
    PoliciesJames PerryAll things related to separate settings/config/policies into community specific things
    Probes & AlarmsDimitrios Christidis, Eric VaanderingProbes and alarms for Nagios
    ProtocolsMaggie Voetberg, Mario LassnigProtocols (Upload, Download, Deletion)
    RebalancingCedric SerfonData rebalancing daemon: BB8
    RecoveryCedric SerfonData recovery daemon: Necromancer and suspicious replica recovery
    Release managementMartin Barisits, Dimitrios ChristidisPackaging of new versions, package configuration
    ReplicasRiccardo Di Maio, Alexander RichardsReplicas related workflows (list_replicas, add_replica, ...)
    REST & APIMaggie Voetberg, Martin BarisitsWeb-Framework (Web.py & Flask)
    RulesRiccardo Di Maio, Martin BarisitsReplication rules and rule daemons: Judge
    SubscriptionsCedric SerfonSubscription daemon: Transmogrifier
    TestingMayank Sharma, Riccardo Di MaioRegression and Unit tests, automatic tests of submissions
    TransfersRiccardo Di Maio, Hugo Gonzalez LabradorTransfer daemons: conveyor and functional transfer tests
    WebUIMayank Sharma, Eraldo Silva JuniorWeb user interface: Rucio Web UI
    \ No newline at end of file diff --git a/contact_us/index.html b/contact_us/index.html index 6fbb48e876..f1abe0ea6d 100644 --- a/contact_us/index.html +++ b/contact_us/index.html @@ -9,8 +9,8 @@ - - + +

    Contact us

    We know getting started can be difficult, which is why @@ -36,6 +36,6 @@

    Email usemail

    Social Media

    Follow us on Mastodon to stay updated -with the latest on Rucio!

    +with the latest on Rucio!

    \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html index 0665970eaa..1a96094994 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -9,8 +9,8 @@ - - + + +

    A more indepth set of coding style guidelines can be found here.

    \ No newline at end of file diff --git a/developer/dependency_management/index.html b/developer/dependency_management/index.html index 98776d286d..58ffe9a799 100644 --- a/developer/dependency_management/index.html +++ b/developer/dependency_management/index.html @@ -9,8 +9,8 @@ - - + + +Because of this, client dependencies are left unpinned unless necessary.

    \ No newline at end of file diff --git a/developer/dev_style_guide/index.html b/developer/dev_style_guide/index.html index e37d664b93..5f01a76395 100644 --- a/developer/dev_style_guide/index.html +++ b/developer/dev_style_guide/index.html @@ -9,8 +9,8 @@ - - + +

    TL;DR - Install the provided pre-commits, follow their recommendations

    @@ -88,6 +88,6 @@

    GitHub Actions

    These checks can also be run locally using

    tools/count_missing_type_annotations_utils.sh
    tools/run_pyright.sh generate {report_output_path.json}

    The first action will raise an error if your commits introduce more un-annotated types than it solves, -and the second ensures the added types are consistent with the rest of the codebase.

    +and the second ensures the added types are consistent with the rest of the codebase.

    \ No newline at end of file diff --git a/developer/rest_api_doc/index.html b/developer/rest_api_doc/index.html index 2221ec3088..46a129080d 100644 --- a/developer/rest_api_doc/index.html +++ b/developer/rest_api_doc/index.html @@ -9,8 +9,8 @@ - - + + +input validation.

    \ No newline at end of file diff --git a/developer/setting_up_intellij_dev_env/index.html b/developer/setting_up_intellij_dev_env/index.html index a0d010abeb..1f1f95d5e5 100644 --- a/developer/setting_up_intellij_dev_env/index.html +++ b/developer/setting_up_intellij_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +

    This will allow to debug the code on server side.

    \ No newline at end of file diff --git a/developer/setting_up_mac_apple_silicon/index.html b/developer/setting_up_mac_apple_silicon/index.html index 23d4441833..cc3016c082 100644 --- a/developer/setting_up_mac_apple_silicon/index.html +++ b/developer/setting_up_mac_apple_silicon/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up a Rucio Developer environment on Mac with Apple Silicon

    Setting up a Rucio Developer environment on Mac with Apple Silicon

    @@ -29,6 +29,6 @@

    Docker en

    Set Docker default platform to linux/amd64:

        export DOCKER_DEFAULT_PLATFORM=linux/amd64

    Or run it as part of the command a single time:

    -
        DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f <docker-compose-file.yml>

    +
        DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose -f <docker-compose-file.yml>
    \ No newline at end of file diff --git a/developer/setting_up_vscode_dev_env/index.html b/developer/setting_up_vscode_dev_env/index.html index fd18c5b81a..b69e1e9c22 100644 --- a/developer/setting_up_vscode_dev_env/index.html +++ b/developer/setting_up_vscode_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/developer/type_annotation_guide/index.html b/developer/type_annotation_guide/index.html index a3bb1fa4e8..4534310527 100644 --- a/developer/type_annotation_guide/index.html +++ b/developer/type_annotation_guide/index.html @@ -9,8 +9,8 @@ - - + +

    Type Annotation Guide

    The purpose of this document is to collaboratively create the developer @@ -264,6 +264,6 @@

    Best Practice

    Common Types

    To ensure a consistent use of type annotations in Rucio, here is a list of common variables with their corresponding type:

    -
    Code sectionVariableTypeDescription
    *sessionsqlalchemy.orm.session.SessionThe sqlalchemy session.
    DIDscopestrThe scope of a DID.
    DIDnamestrThe name of a DID.
    DIDaccountstrThe account name.
    DIDdid_typestrThe DID type.
    +
    Code sectionVariableTypeDescription
    *sessionsqlalchemy.orm.session.SessionThe sqlalchemy session.
    DIDscopestrThe scope of a DID.
    DIDnamestrThe name of a DID.
    DIDaccountstrThe account name.
    DIDdid_typestrThe DID type.
    \ No newline at end of file diff --git a/developer/webui/streamedtables/index.html b/developer/webui/streamedtables/index.html index c7d3683968..220819f835 100644 --- a/developer/webui/streamedtables/index.html +++ b/developer/webui/streamedtables/index.html @@ -9,8 +9,8 @@ - - + +
    +
    'use client';
    import { ListSubscription as ListSubscriptionStory } from "@/component-library/Pages/Subscriptions/ListSubscription";
    import { useEffect } from "react";
    import useComDOM from "@/lib/infrastructure/hooks/useComDOM";
    import { SubscriptionRuleStatesViewModel } from "@/lib/infrastructure/data/view-model/subscriptions";

    export default function ListSubscription({ params }: { params: { account: string }}) {
    // initialise ComDOM
    const ComDOM = useComDOM<SubscriptionRuleStatesViewModel>(
    "subscription-rule-states-query",
    [],
    false,
    Infinity,
    50,
    true
    )
    // auto-start query, GET data from /api/list-subscription, use param account
    useEffect(() => {
    const runQuery = async () => {
    await ComDOM.start({
    url: new URL("http://localhost:3000/api/list-subscription"),
    method: "GET",
    headers: new Headers({
    'Content-Type': 'application/json'
    } as HeadersInit),
    params: {
    "account": params.account,
    }
    })
    }
    runQuery()
    }, [])
    // * return a react component
    // * in this case the StreamedTable is wrapped by a Storybook Page
    // * we pass the ComDOM to this page so that it may be passed further down
    // to the StreamedTable
    return (
    <div>
    <ListSubscriptionStory
    accountname={params.account}
    comdom={ComDOM}
    />
    </div>
    )
    }
    \ No newline at end of file diff --git a/developer/webui/webui_frontend/index.html b/developer/webui/webui_frontend/index.html index 47d7b538ec..c572dda633 100644 --- a/developer/webui/webui_frontend/index.html +++ b/developer/webui/webui_frontend/index.html @@ -9,8 +9,8 @@ - - + +

    Developing the WebUI Frontend

    Notes on external frameworks

    @@ -300,6 +300,6 @@
    mockUseComDOM< which will raise Hydration Errors. This is because the page rendered on the server does not match the first render of the page on the client (because both use random fixture generators). However, you can choose to ignore the Hydration -Errors for the time being.

    +Errors for the time being.

    \ No newline at end of file diff --git a/developer/webui/webui_frontend_vscode_dev_env/index.html b/developer/webui/webui_frontend_vscode_dev_env/index.html index 9b2413aa82..e05ca97244 100644 --- a/developer/webui/webui_frontend_vscode_dev_env/index.html +++ b/developer/webui/webui_frontend_vscode_dev_env/index.html @@ -9,8 +9,8 @@ - - + + +secret/ account root under the VO Default.

    \ No newline at end of file diff --git a/html/rest_api_doc.html b/html/rest_api_doc.html index a0bae04f58..ff7927e944 100644 --- a/html/rest_api_doc.html +++ b/html/rest_api_doc.html @@ -1852,16 +1852,16 @@ data-styled.g14[id="sc-crzoAE"]{content:"iUxAWq,"}/*!sc*/ .dvcDrG{height:18px;width:18px;min-width:18px;vertical-align:middle;float:right;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ .iPqByX{height:1.3em;width:1.3em;min-width:1.3em;vertical-align:middle;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ -.dqYXmg{height:1.5em;width:1.5em;min-width:1.5em;vertical-align:middle;float:left;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ -.dqYXmg polygon{fill:#1d8127;}/*!sc*/ .bRmrKA{height:20px;width:20px;min-width:20px;vertical-align:middle;float:right;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);}/*!sc*/ .bRmrKA polygon{fill:white;}/*!sc*/ +.dqYXmg{height:1.5em;width:1.5em;min-width:1.5em;vertical-align:middle;float:left;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ +.dqYXmg polygon{fill:#1d8127;}/*!sc*/ .dVWHLw{height:1.5em;width:1.5em;min-width:1.5em;vertical-align:middle;float:left;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ .dVWHLw polygon{fill:#d41f1c;}/*!sc*/ .hGHhhO{height:18px;width:18px;min-width:18px;vertical-align:middle;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ .cTsyql{height:1.5em;width:1.5em;min-width:1.5em;vertical-align:middle;float:left;-webkit-transition:-webkit-transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out;transition:transform 0.2s ease-out;-webkit-transform:rotateZ(-90deg);-ms-transform:rotateZ(-90deg);transform:rotateZ(-90deg);}/*!sc*/ .cTsyql polygon{fill:#ffa500;}/*!sc*/ -data-styled.g15[id="sc-dIsUp"]{content:"dvcDrG,iPqByX,dqYXmg,bRmrKA,dVWHLw,hGHhhO,cTsyql,"}/*!sc*/ +data-styled.g15[id="sc-dIsUp"]{content:"dvcDrG,iPqByX,bRmrKA,dqYXmg,dVWHLw,hGHhhO,cTsyql,"}/*!sc*/ .eSYQnm{display:inline-block;padding:2px 8px;margin:0;background-color:#ffa500;color:#ffffff;font-size:13px;vertical-align:middle;line-height:1.6;border-radius:4px;font-weight:600;font-size:12px;}/*!sc*/ .eSYQnm + span[type]{margin-left:4px;}/*!sc*/ data-styled.g16[id="sc-bqGGPW"]{content:"eSYQnm,"}/*!sc*/ @@ -2194,12 +2194,12 @@ .ilvUMs ..sc-jXcxbT{color:#ffffff;}/*!sc*/ .ilvUMs:focus{box-shadow:inset 0 2px 2px rgba(0,0,0,0.45),0 2px 0 rgba(128,128,128,0.25);}/*!sc*/ data-styled.g114[id="sc-eEVmNe"]{content:"ilvUMs,"}/*!sc*/ -.ldMUmp{font-size:0.929em;line-height:20px;background-color:#186FAF;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ .bJzUtf{font-size:0.929em;line-height:20px;background-color:#cc3333;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ +.ldMUmp{font-size:0.929em;line-height:20px;background-color:#186FAF;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ .ihNycv{font-size:0.929em;line-height:20px;background-color:#2F8132;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ .blNLGm{font-size:0.929em;line-height:20px;background-color:#95507c;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ .hIFOpc{font-size:0.929em;line-height:20px;background-color:#947014;color:#ffffff;padding:3px 10px;text-transform:uppercase;font-family:Montserrat,sans-serif;margin:0;}/*!sc*/ -data-styled.g115[id="sc-fmdNqN"]{content:"ldMUmp,bJzUtf,ihNycv,blNLGm,hIFOpc,"}/*!sc*/ +data-styled.g115[id="sc-fmdNqN"]{content:"bJzUtf,ldMUmp,ihNycv,blNLGm,hIFOpc,"}/*!sc*/ .flIrdF{position:absolute;width:100%;z-index:100;background:#fafafa;color:#263238;box-sizing:border-box;box-shadow:0px 0px 6px rgba(0,0,0,0.33);overflow:hidden;border-bottom-left-radius:4px;border-bottom-right-radius:4px;-webkit-transition:all 0.25s ease;transition:all 0.25s ease;visibility:hidden;-webkit-transform:translateY(-50%) scaleY(0);-ms-transform:translateY(-50%) scaleY(0);transform:translateY(-50%) scaleY(0);}/*!sc*/ data-styled.g116[id="sc-ljsmAU"]{content:"flIrdF,"}/*!sc*/ .fQkroN{padding:10px;}/*!sc*/ @@ -2207,16 +2207,16 @@ .dfUAUz{padding:5px;border:1px solid #ccc;background:#fff;word-break:break-all;color:#32329f;}/*!sc*/ .dfUAUz > span{color:#333333;}/*!sc*/ data-styled.g118[id="sc-dTSzeu"]{content:"dfUAUz,"}/*!sc*/ -.lbYftx{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#1d8127;background-color:rgba(29,129,39,0.07);}/*!sc*/ -.lbYftx:focus{outline:auto #1d8127;}/*!sc*/ -.cGFwjB{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#d41f1c;background-color:rgba(212,31,28,0.07);cursor:default;}/*!sc*/ -.cGFwjB:focus{outline:auto #d41f1c;}/*!sc*/ -.cGFwjB::before{content:"—";font-weight:bold;width:1.5em;text-align:center;display:inline-block;vertical-align:top;}/*!sc*/ -.cGFwjB:focus{outline:0;}/*!sc*/ .jUGDyD{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#1d8127;background-color:rgba(29,129,39,0.07);cursor:default;}/*!sc*/ .jUGDyD:focus{outline:auto #1d8127;}/*!sc*/ .jUGDyD::before{content:"—";font-weight:bold;width:1.5em;text-align:center;display:inline-block;vertical-align:top;}/*!sc*/ .jUGDyD:focus{outline:0;}/*!sc*/ +.cGFwjB{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#d41f1c;background-color:rgba(212,31,28,0.07);cursor:default;}/*!sc*/ +.cGFwjB:focus{outline:auto #d41f1c;}/*!sc*/ +.cGFwjB::before{content:"—";font-weight:bold;width:1.5em;text-align:center;display:inline-block;vertical-align:top;}/*!sc*/ +.cGFwjB:focus{outline:0;}/*!sc*/ +.lbYftx{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#1d8127;background-color:rgba(29,129,39,0.07);}/*!sc*/ +.lbYftx:focus{outline:auto #1d8127;}/*!sc*/ .fpOpCW{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#ffa500;background-color:rgba(255,165,0,0.1);cursor:default;}/*!sc*/ .fpOpCW:focus{outline:auto #ffa500;}/*!sc*/ .fpOpCW::before{content:"—";font-weight:bold;width:1.5em;text-align:center;display:inline-block;vertical-align:top;}/*!sc*/ @@ -2225,7 +2225,7 @@ .NAUPn:focus{outline:auto #d41f1c;}/*!sc*/ .crRaBc{display:block;border:0;width:100%;text-align:left;padding:10px;border-radius:2px;margin-bottom:4px;line-height:1.5em;cursor:pointer;color:#ffa500;background-color:rgba(255,165,0,0.1);}/*!sc*/ .crRaBc:focus{outline:auto #ffa500;}/*!sc*/ -data-styled.g119[id="sc-htmcrh"]{content:"lbYftx,cGFwjB,jUGDyD,fpOpCW,NAUPn,crRaBc,"}/*!sc*/ +data-styled.g119[id="sc-htmcrh"]{content:"jUGDyD,cGFwjB,lbYftx,fpOpCW,NAUPn,crRaBc,"}/*!sc*/ .cMoEZ{vertical-align:top;}/*!sc*/ data-styled.g123[id="sc-fWWYYk"]{content:"cMoEZ,"}/*!sc*/ .DvFer{font-size:1.3em;padding:0.2em 0;margin:3em 0 1.1em;color:#333333;font-weight:normal;}/*!sc*/ @@ -2264,7 +2264,7 @@ -
    Error handling
    ExceptionClass ExceptionMessage
     

    Where ExceptionClass refers to Rucio Exceptions.

    -

    Account Limit

    Create or update a local account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    -
    rse
    required
    string

    The rse for the accountlimit.

    -
    Request Body schema: application/json
    bytes
    required
    integer

    The new limit in bytes.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "bytes": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete a local account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    +

    Account Limit

    Delete a local account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    rse
    required
    string

    The rse for the accountlimit.

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/accountlimits/local/{account}/{rse} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create or update a global account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    -
    rse_expression
    required
    string

    The rse expression for the accountlimit.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create or update a local account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    +
    rse
    required
    string

    The rse for the accountlimit.

    Request Body schema: application/json
    bytes
    required
    integer

    The new limit in bytes.

    Responses

    Request samples

    Content type
    application/json
    {
    • "bytes": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete a global account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    +

    Request samples

    Content type
    application/json
    {
    • "bytes": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete a global account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    rse_expression
    required
    string

    The rse expression for the accountlimit.

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/accountlimits/global/{account}/{rse_expression} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Account

    Create attribute

    Create an attribute to an account.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create or update a global account limit

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account for the accountlimit.

    +
    rse_expression
    required
    string

    The rse expression for the accountlimit.

    +
    Request Body schema: application/json
    bytes
    required
    integer

    The new limit in bytes.

    +

    Responses

    Request samples

    Content type
    application/json
    {
    • "bytes": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Account

    Create attribute

    Create an attribute to an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    key
    required
    string

    The key of the account attribute.

    Request Body schema: application/json
    key
    string

    The key of the attribute. This would override the key defined in path.

    @@ -2412,22 +2412,22 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string",
    • "email": "string",
    • "password": "none",
    • "default": false
    }

    Response samples

    Content type
    application/json
    "Created"

    List identities

    Lists all identities for an account.

    -
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/accounts/{account}/identities \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • [
      ]
    ]

    Delete identity

    Delete an account identity.

    +

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string",
    • "email": "string",
    • "password": "none",
    • "default": false
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete identity

    Delete an account identity.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    Request Body schema: application/json
    identity
    required
    string

    The identity.

    authtype
    required
    string

    The authtype.

    Responses

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string"
    }

    List rules

    Lists all rules for an account.

    +

    Request samples

    Content type
    application/json
    {
    • "identity": "string",
    • "authtype": "string"
    }

    List identities

    Lists all identities for an account.

    +
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/accounts/{account}/identities \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • [
      ]
    ]

    List rules

    Lists all rules for an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/accounts/{account}/usage/global/{rse_expression} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Update

    Update a parameter for an account.

    -
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -
    Request Body schema: application/json
    object

    Json object with key-value pairs corresponding to the new values of the parameters.

    -

    Responses

    Request samples

    Content type
    application/json
    { }

    Create

    Create an account.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Create

    Create an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    Request Body schema: application/json
    type
    required
    string
    Enum: "USER" "GROUP" "SERVICE"

    The account type.

    email
    required
    string

    The email for the account.

    @@ -2477,27 +2470,39 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "type": "USER",
    • "email": "string"
    }

    Response samples

    Content type
    application/json
    "Created"

    List account parameters

    Lists all parameters for an account.

    +

    Request samples

    Content type
    application/json
    {
    • "type": "USER",
    • "email": "string"
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete

    Delete an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -

    Responses

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/accounts/{account} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "account": "string",
    • "account_type": "string",
    • "status": "string",
    • "email": "string",
    • "suspended_at": "string",
    • "deleted_at": "string"
    }

    Delete

    Delete an account.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update

    Update a parameter for an account.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    -

    Responses

    Request Body schema: application/json
    object

    Json object with key-value pairs corresponding to the new values of the parameters.

    +

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    Content type
    application/json
    { }

    List account parameters

    Lists all parameters for an account.

    +
    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account identifier.

    +

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/accounts/{account} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    List

    List all accounts.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "account": "string",
    • "account_type": "string",
    • "status": "string",
    • "email": "string",
    • "suspended_at": "string",
    • "deleted_at": "string"
    }

    List

    List all accounts.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/accounts \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Auth

    UserPass

    Authenticate a Rucio account temporarily via username and password.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Auth

    UserPass Allow cross-site scripting

    UserPass Allow cross-site scripting. Explicit for Authentication.

    +
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/userpass \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    UserPass

    Authenticate a Rucio account temporarily via username and password.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string

    Account identifier as a string.

    X-Rucio-Username
    required
    string

    Username as a string.

    X-Rucio-Password
    required
    string

    password as a text-plain string.

    @@ -2506,109 +2511,109 @@

    Error handling

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/userpass \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
       --header 'X-Rucio-Password: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Username: SOME_STRING_VALUE'

    UserPass Allow cross-site scripting

    UserPass Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Username: SOME_STRING_VALUE'

    GSS Allow cross-site scripting

    GSS Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/userpass \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS

    Authenticate a Rucio account via GSS.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/gss \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS

    Authenticate a Rucio account via GSS.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    REMOTE_USER
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/gss \
       --header 'REMOTE_USER: SOME_STRING_VALUE' \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    GSS Allow cross-site scripting

    GSS Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509 Allow cross-site scripting

    x509 Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/gss \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509

    Authenticate a Rucio account via x509.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/x509 \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509

    Authenticate a Rucio account via x509.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string
    X-Rucio-Allow-Return-Multiple-Accounts
    boolean

    If set to true, a HTTP 206 response will be returned if the identity is associated with multiple accounts.

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/x509 \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-Allow-Return-Multiple-Accounts: SOME_BOOLEAN_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    x509 Allow cross-site scripting

    x509 Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH Allow cross-site scripting

    SSH Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/x509 \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH

    Authenticate a Rucio account via SSH.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/ssh \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSH

    Authenticate a Rucio account via SSH.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-SSH-Signature
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/ssh \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
    -  --header 'X-Rucio-SSH-Signature: SOME_STRING_VALUE'

    SSH Allow cross-site scripting

    SSH Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-SSH-Signature: SOME_STRING_VALUE'

    SSHChallengeToken Allow cross-site scripting

    SSHChallengeToken Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/ssh \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken

    Authenticate a Rucio account via SSHChallengeToken.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/ssh_challenge_token \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken

    Authenticate a Rucio account via SSHChallengeToken.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/ssh_challenge_token \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SSHChallengeToken Allow cross-site scripting

    SSHChallengeToken Allow cross-site scripting. Explicit for Authentication.

    -
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/ssh_challenge_token \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Post a SAML request

    Post a SAML request

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request POST \
       --url http://undefinedundefined/auth/saml \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML

    Authenticate a Rucio account via SAML.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML Allow cross-site scripting

    SAML Allow cross-site scripting. Explicit for Authentication.

    +
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/saml \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML

    Authenticate a Rucio account via SAML.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-AppID
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/saml \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
       --header 'X-Rucio-AppID: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    SAML Allow cross-site scripting

    SAML Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate Allow cross-site scripting

    Validate Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/saml \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate

    Validate a Rucio auth token.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/validate \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate

    Validate a Rucio auth token.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/validate \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Validate Allow cross-site scripting

    Validate Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC Allow cross-site scripting

    OIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/validate \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC

    Authenticate a Rucio account via OIDC.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC

    Authenticate a Rucio account via OIDC.

    Authorizations:
    AuthToken
    header Parameters
    HTTP_X_RUCIO_ACCOUNT
    string

    Account identifier as a string.

    HTTP_X_RUCIO_CLIENT_AUTHORIZE_SCOPE
    string
    HTTP_X_RUCIO_CLIENT_AUTHORIZE_AUDIENCE
    string
    HTTP_X_RUCIO_CLIENT_AUTHORIZE_AUTO
    string
    HTTP_X_RUCIO_CLIENT_AUTHORIZE_ISSUER
    string
    HTTP_X_RUCIO_CLIENT_AUTHORIZE_POLLING
    string
    HTTP_X_RUCIO_CLIENT_AUTHORIZE_REFRESH_LIFETIME
    string
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc \
       --header 'HTTP_X_RUCIO_ACCOUNT: SOME_STRING_VALUE' \
       --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_AUDIENCE: SOME_STRING_VALUE' \
    @@ -2618,56 +2623,51 @@ 

    Error handling

    --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_REFRESH_LIFETIME: SOME_STRING_VALUE' \ --header 'HTTP_X_RUCIO_CLIENT_AUTHORIZE_SCOPE: SOME_STRING_VALUE' \ --header 'X-Forwarded-For: SOME_STRING_VALUE' \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    OIDC Allow cross-site scripting

    OIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC Allow cross-site scripting

    TokenOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC

    Authenticate a Rucio account via TokenOIDC.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_token \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC

    Authenticate a Rucio account via TokenOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_token \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    TokenOIDC Allow cross-site scripting

    TokenOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC Allow cross-site scripting

    CodeOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_token \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC

    Authenticate a Rucio account via CodeOIDC.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_code \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC

    Authenticate a Rucio account via CodeOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Forwarded-For
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_code \
       --header 'X-Forwarded-For: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    CodeOIDC Allow cross-site scripting

    CodeOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC Allow cross-site scripting

    RedirectOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_code \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC

    Authenticate a Rucio account via RedirectOIDC.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_redirect \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RedirectOIDC

    Authenticate a Rucio account via RedirectOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Client-Fetch-Token
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_redirect \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \
    -  --header 'X-Rucio-Client-Fetch-Token: SOME_STRING_VALUE'

    RedirectOIDC Allow cross-site scripting

    RedirectOIDC Allow cross-site scripting. Explicit for Authentication.

    + --header 'X-Rucio-Client-Fetch-Token: SOME_STRING_VALUE'

    RefreshOIDC Allow cross-site scripting

    RefreshOIDC Allow cross-site scripting. Explicit for Authentication.

    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_redirect \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC

    Authenticate a Rucio account via RefreshOIDC.

    +

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/auth/oidc_refresh \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC

    Authenticate a Rucio account via RefreshOIDC.

    Authorizations:
    AuthToken
    header Parameters
    X-Rucio-Account
    required
    string
    X-Rucio-Auth-Token
    required
    string

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/auth/oidc_refresh \
       --header 'X-Rucio-Account: SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    RefreshOIDC Allow cross-site scripting

    RefreshOIDC Allow cross-site scripting. Explicit for Authentication.

    -
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/auth/oidc_refresh \
       --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Config

    Create value

    Create or set the value of an option.

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string

    The section.

    option
    required
    string

    The option of the section.

    @@ -2677,23 +2677,23 @@

    Error handling

    Request samples

    curl --request PUT \
       --url http://undefinedundefined/config/{section}/{option}/{value} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "Created"

    Get option

    Returns the value of an option

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "Created"

    Delete option

    Delete an option of a section.

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string

    The section.

    option
    required
    string

    The option of the section.

    -

    Responses

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/config/{section}/{option} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "string"

    Delete option

    Delete an option of a section.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Get option

    Returns the value of an option

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string

    The section.

    option
    required
    string

    The option of the section.

    -

    Responses

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/config/{section}/{option} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    List Sections

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string

    The section to return.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "string"

    List Sections

    Authorizations:
    AuthToken
    path Parameters
    section
    required
    string

    The section to return.

    Request Body schema: application/json
    bytes
    required
    integer

    The new limit in bytes.

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/config \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Credentials

    Sign URL

    Sign a url for a limited lifetime for a particular srevice.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Credentials

    Cross-Site Scripting

    Allow cross-site scripting. Explicit for Authentication.

    +
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    +  --url http://undefinedundefined/credentials/signurl \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Sign URL

    Sign a url for a limited lifetime for a particular srevice.

    Authorizations:
    AuthToken
    query Parameters
    rse
    required
    string

    The RSE to authenticate against.

    lifetime
    string

    The lifetime, default 600s.

    svc
    string

    The service, default gcs.

    @@ -2724,14 +2729,9 @@

    Error handling

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Cross-Site Scripting

    Allow cross-site scripting. Explicit for Authentication.

    -
    Authorizations:
    AuthToken

    Responses

    Request samples

    curl --request OPTIONS \
    -  --url http://undefinedundefined/credentials/signurl \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Data Identifiers

    Get Data Identifier

    Return all data identifiers in the given scope.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Data Identifiers

    Get Data Identifier

    Return all data identifiers in the given scope.

    Authorizations:
    AuthToken
    path Parameters
    scope
    required
    string

    The scope.

    Request Body schema: application/json
    name
    string

    The name of the did.

    recursive
    boolean

    If specified, also returns the child ids recursively.

    @@ -2802,21 +2802,21 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "rse": "string",
    • "account": "string",
    • "dids": {
      }
    }

    Response samples

    Content type
    application/json
    "Created"

    Get did

    Returns the contents of a data identifier.

    +

    Request samples

    Content type
    application/json
    {
    • "rse": "string",
    • "account": "string",
    • "dids": {
      }
    }

    Response samples

    Content type
    application/json
    "Created"

    Detach dids from did

    Detach data identifiers from data identifiers.

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +
    Request Body schema: application/json
    required
    Array of objects

    The dids to detach.

    +

    Responses

    Request samples

    Content type
    application/json
    {
    • "dids": [
      ]
    }

    Get did

    Returns the contents of a data identifier.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/dids/{scope_name}/dids \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Detach dids from did

    Detach data identifiers from data identifiers.

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -
    Request Body schema: application/json
    required
    Array of objects

    The dids to detach.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "dids": [
      ]
    }

    Add metadata

    Add metadata to a did.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Add metadata

    Add metadata to a did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    Request Body schema: application/json
    meta
    required
    object

    The metadata to add. A dictionary containing the metadata name as key and the value as value.

    recursive
    boolean
    Default: false

    Flag if the metadata should be applied recirsively to children.

    @@ -2824,16 +2824,7 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "meta": { },
    • "recursive": false
    }

    Response samples

    Content type
    application/json
    "Created"

    Get metadata

    Get the metadata of a did.

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -
    query Parameters
    plugin
    string
    Default: "DID_COLUMN"

    The plugin to use.

    -

    Responses

    Request samples

    curl --request GET \
    -  --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Delete metadata

    Deletes the specified metadata from the did.

    +

    Request samples

    Content type
    application/json
    {
    • "meta": { },
    • "recursive": false
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete metadata

    Deletes the specified metadata from the did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    query Parameters
    key
    string

    The key to delete.

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request DELETE \
       --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Add metadata

    Add metadata to a did.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Get metadata

    Get the metadata of a did.

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +
    query Parameters
    plugin
    string
    Default: "DID_COLUMN"

    The plugin to use.

    +

    Responses

    Request samples

    curl --request GET \
    +  --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    { }

    Add metadata

    Add metadata to a did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    key
    required
    string

    The key for the metadata.

    Request Body schema: application/json
    value
    required
    object

    The value to set.

    @@ -2893,23 +2893,23 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Get followers

    Get all followers for a specific did.

    +

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Delete follow

    Mark the input DID as not followed

    +
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    +
    Request Body schema: application/json
    account
    required
    string

    The account to unfollow the did.

    +

    Responses

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Get followers

    Get all followers for a specific did.

    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/dids/{scope_name}/follow \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Delete follow

    Mark the input DID as not followed

    -
    Authorizations:
    AuthToken
    path Parameters
    scope_name
    required
    string

    The scope and the name of the did.

    -
    Request Body schema: application/json
    account
    required
    string

    The account to unfollow the did.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "account": "string"
    }

    Add Dids bulk

    Add new Dids in bulk.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Add Dids bulk

    Add new Dids in bulk.

    Authorizations:
    AuthToken
    Request Body schema: application/json
    Array
    scope
    required
    string

    The did scope.

    name
    required
    string

    The did name.

    type
    required
    string
    Enum: "F" "D" "C" "A" "X" "Y" "Z"

    The type of the did.

    @@ -3368,24 +3368,24 @@

    Error handling

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/subscriptions/{account}/{name}/rules?state=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • null
    ]

    Update subscription

    Update an existing subscription.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • null
    ]

    Create subscription

    Create a new subscription

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    name
    required
    string

    The subscription name.

    Request Body schema: application/json
    required
    object

    The values for the new subscription.

    -

    Responses

    Responses

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Create subscription

    Create a new subscription

    +

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Response samples

    Content type
    application/json
    "string"

    Update subscription

    Update an existing subscription.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    name
    required
    string

    The subscription name.

    Request Body schema: application/json
    required
    object

    The values for the new subscription.

    -

    Responses

    Responses

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Response samples

    Content type
    application/json
    "string"

    Get Subscription

    Retrieve a subscription.

    +

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Get Subscription

    Retrieve a subscription.

    Authorizations:
    AuthToken
    path Parameters
    account
    required
    string

    The account name.

    name
    required
    string

    The subscription name.

    Responses

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/rses/{rse}/attr/{key} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update Rse Distance

    Update rse distance information.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create Rse Distance

    Post a rse distance.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    -
    Request Body schema: application/json
    distance
    integer

    The distance between the RSEs.

    +
    Request Body schema: application/json
    distance
    integer

    The distance between RSEs.

    ranking
    integer
    Deprecated

    Same as distance.

    Responses

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Create Rse Distance

    Post a rse distance.

    +

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Delete Rse Distance

    Delete distance information between source RSE and destination RSE.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    -
    Request Body schema: application/json
    distance
    integer

    The distance between RSEs.

    -
    ranking
    integer
    Deprecated

    Same as distance.

    -

    Responses

    Responses

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get Rse Distances

    Returns the distances between a source and destination rse.

    +

    Request samples

    curl --request DELETE \
    +  --url http://undefinedundefined/rses/{source}/distances/{destination} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "Deleted"

    Update Rse Distance

    Update rse distance information.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    -

    Responses

    Request Body schema: application/json
    distance
    integer

    The distance between the RSEs.

    +
    ranking
    integer
    Deprecated

    Same as distance.

    +

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/rses/{source}/distances/{destination} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Delete Rse Distance

    Delete distance information between source RSE and destination RSE.

    +

    Request samples

    Content type
    application/json
    {
    • "distance": 0,
    • "ranking": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get Rse Distances

    Returns the distances between a source and destination rse.

    Authorizations:
    AuthToken
    path Parameters
    source
    required
    string

    The name of the source Rucio Storage Element.

    destination
    required
    string

    The name of the destination Rucio Storage Element.

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/rses/{source}/distances/{destination} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "Deleted"

    Update Protocol Attributes

    Updates attributes of an existing protocol entry. Because protocol identifier, hostname, and port are used as unique identifier they are immutable.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Delete Protocol Attributes

    Delete all protocol attributes.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    scheme
    required
    string

    The protocol identifier.

    hostname
    required
    string

    The hostname of the protocol.

    port
    required
    integer

    The port of the protocol.

    -

    Responses

    Responses

    Request samples

    curl --request PUT \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "staging_area": "string",
    • "rse_type": "DISK",
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "credentials": "string",
    • "domain": [ ],
    • "id": "string",
    • "lfn2pfn_algorithm": "string",
    • "qos_class": "string",
    • "rse": "string",
    • "sign_url": "string",
    • "verify_checksum": true,
    • "protocols": [
      ]
    }

    Delete Protocol Attributes

    Delete all protocol attributes.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update Protocol Attributes

    Updates attributes of an existing protocol entry. Because protocol identifier, hostname, and port are used as unique identifier they are immutable.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    scheme
    required
    string

    The protocol identifier.

    hostname
    required
    string

    The hostname of the protocol.

    port
    required
    integer

    The port of the protocol.

    -

    Responses

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request PUT \
       --url http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    List RSE Protocols

    List all supported protocols of the given RSE.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "staging_area": "string",
    • "rse_type": "DISK",
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "credentials": "string",
    • "domain": [ ],
    • "id": "string",
    • "lfn2pfn_algorithm": "string",
    • "qos_class": "string",
    • "rse": "string",
    • "sign_url": "string",
    • "verify_checksum": true,
    • "protocols": [
      ]
    }

    List RSE Protocols

    List all supported protocols of the given RSE.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/rses/{rse}/usage/history \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Update Rse Limit

    Update an rse limit.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/x-json-stream
    [
    • {
      }
    ]

    Delete Rse Limit

    Delete an rse limit

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -
    Request Body schema: application/json
    name
    string

    The name of the limit.

    -
    value
    integer

    The value of the limit.

    +
    Request Body schema: application/json
    name
    required
    string

    The name of the limit.

    Responses

    Request samples

    Content type
    application/json
    {
    • "name": "string",
    • "value": 0
    }

    Get Rse Limits

    Get the rse limits.

    +

    Request samples

    Content type
    application/json
    {
    • "name": "string"
    }

    Update Rse Limit

    Update an rse limit.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -

    Responses

    Request Body schema: application/json
    name
    string

    The name of the limit.

    +
    value
    integer

    The value of the limit.

    +

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/rses/{rse}/limits \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "limit name1": 0,
    • "limit name2": 0
    }

    Delete Rse Limit

    Delete an rse limit

    +

    Request samples

    Content type
    application/json
    {
    • "name": "string",
    • "value": 0
    }

    Get Rse Limits

    Get the rse limits.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -
    Request Body schema: application/json
    name
    required
    string

    The name of the limit.

    -

    Responses

    Responses

    Request samples

    Content type
    application/json
    {
    • "name": "string"
    }

    Add QoS policy

    Add a QoS Policy to a RSE.

    +

    Request samples

    curl --request GET \
    +  --url http://undefinedundefined/rses/{rse}/limits \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "limit name1": 0,
    • "limit name2": 0
    }

    Add QoS policy

    Add a QoS Policy to a RSE.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    policy
    required
    string

    The QoS policy to add to and rse.

    Responses

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/rses/{rse}/qos_policy/{policy} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update RSE

    Update RSE properties.

    -
    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -
    Request Body schema: application/json
    availability_read
    boolean

    The vailability of the RSE.

    -
    availability_write
    boolean

    The vailability of the RSE.

    -
    availability_delete
    boolean

    The vailability of the RSE.

    -
    deterministic
    boolean

    If the pfn is generated deterministicly.

    -
    volatile
    boolean

    RSE cache.

    -
    city
    string

    The city of the RSE.

    -
    staging_area
    string

    Staging area.

    -
    region_code
    string

    The region code of the RSE.

    -
    country_name
    string

    The country name of the RSE.

    -
    time_zone
    string

    The time zone of the RSE.

    -
    rse_type
    string
    Enum: "DISK" "TAPE"

    The rse type.

    -
    latitude
    number

    The latitude of the RSE.

    -
    longitude
    number

    The longitude of the RSE.

    -

    Responses

    Request samples

    Content type
    application/json
    {
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "time_zone": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Create RSE

    Creates a RSE with all the metadata.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create RSE

    Creates a RSE with all the metadata.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    Request Body schema: application/json
    deterministic
    boolean

    If the pfn is generated deterministicly.

    volatile
    boolean

    RSE cache.

    @@ -3670,22 +3651,41 @@

    Error handling

    Request samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true
    }

    Response samples

    Content type
    application/json
    "Created"

    Get RSE

    Get details about a specific RSE.

    +

    Request samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true
    }

    Response samples

    Content type
    application/json
    "Created"

    Disable RSE

    Disable a specific RSE.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -

    Responses

    Responses

    Request samples

    curl --request GET \
    +

    Request samples

    curl --request DELETE \
       --url http://undefinedundefined/rses/{rse} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": 0,
    • "availability_write": 0,
    • "availability_delete": null
    }

    Disable RSE

    Disable a specific RSE.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update RSE

    Update RSE properties.

    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    -

    Responses

    Request Body schema: application/json
    availability_read
    boolean

    The vailability of the RSE.

    +
    availability_write
    boolean

    The vailability of the RSE.

    +
    availability_delete
    boolean

    The vailability of the RSE.

    +
    deterministic
    boolean

    If the pfn is generated deterministicly.

    +
    volatile
    boolean

    RSE cache.

    +
    city
    string

    The city of the RSE.

    +
    staging_area
    string

    Staging area.

    +
    region_code
    string

    The region code of the RSE.

    +
    country_name
    string

    The country name of the RSE.

    +
    time_zone
    string

    The time zone of the RSE.

    +
    rse_type
    string
    Enum: "DISK" "TAPE"

    The rse type.

    +
    latitude
    number

    The latitude of the RSE.

    +
    longitude
    number

    The longitude of the RSE.

    +

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    Content type
    application/json
    {
    • "availability_read": true,
    • "availability_write": true,
    • "availability_delete": true,
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "time_zone": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0
    }

    Response samples

    Content type
    application/json
    "Created"

    Get RSE

    Get details about a specific RSE.

    +
    Authorizations:
    AuthToken
    path Parameters
    rse
    required
    string

    The name of the Rucio Storage Element name.

    +

    Responses

    Request samples

    curl --request GET \
       --url http://undefinedundefined/rses/{rse} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    List RSEs

    Lists all RSEs.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    {
    • "deterministic": true,
    • "volatile": true,
    • "city": "string",
    • "staging_area": "string",
    • "region_code": "string",
    • "country_name": "string",
    • "continent": "string",
    • "time_zone": "string",
    • "ISP": "string",
    • "rse_type": "DISK",
    • "latitude": 0,
    • "longitude": 0,
    • "ASN": "string",
    • "availability": 0,
    • "availability_read": 0,
    • "availability_write": 0,
    • "availability_delete": null
    }

    List RSEs

    Lists all RSEs.

    Authorizations:
    AuthToken
    query Parameters
    expression
    string

    RSE expression to select RSEs.

    Responses

    Request samples

    curl --request GET \
       --url 'http://undefinedundefined/rses/?expression=SOME_STRING_VALUE' \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Rule

    Update the replication rules parameters

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • {
      }
    ]

    Rule

    Delete a replication rule

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    +

    Responses

    Request samples

    curl --request DELETE \
    +  --url http://undefinedundefined/rules/{rule_id} \
    +  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Update the replication rules parameters

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    Request Body schema: application/json

    Parameters for the new rule.

    required
    object

    The parameters to change.

    Responses

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Return a Rule

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    +

    Request samples

    Content type
    application/json
    {
    • "options": {
      }
    }

    Return a Rule

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    Responses

    Request samples

    curl --request GET \
    -  --url http://undefinedundefined/rules/{rule_id} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "string"

    Delete a replication rule

    Authorizations:
    AuthToken
    path Parameters
    rule_id
    required
    string

    The id of the replication rule.

    -

    Responses

    Request samples

    curl --request DELETE \
    +

    Request samples

    curl --request GET \
       --url http://undefinedundefined/rules/{rule_id} \
    -  --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Create a new replication rule

    Authorizations:
    AuthToken
    Request Body schema: application/json

    Parameters for the new rule.

    + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    "string"

    Create a new replication rule

    Authorizations:
    AuthToken
    Request Body schema: application/json

    Parameters for the new rule.

    required
    Array of objects

    The list of data identifiers.

    account
    required
    string

    The account of the issuer.

    copies
    required
    integer

    The number of replicas.

    @@ -3816,7 +3816,7 @@

    Error handling

    --url http://undefinedundefined/scopes/{account}/scopes \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE'

    Response samples

    Content type
    application/json
    [
    • "string"
    ]
    - - + +
    +
    \ No newline at end of file diff --git a/join_rucio_mattermost/index.html b/join_rucio_mattermost/index.html index d78b1c0e77..b1834a49da 100644 --- a/join_rucio_mattermost/index.html +++ b/join_rucio_mattermost/index.html @@ -9,8 +9,8 @@ - - + +

    How to join Rucio mattermost

    We have a dedicated Mattermost Workspace where developers, administrators, and @@ -32,6 +32,6 @@

    Open https://mattermost.web.cern.ch/rucio/ in your browser or with a mattermost client application.

    -

    +
    \ No newline at end of file diff --git a/operator/administration/index.html b/operator/administration/index.html index 1c4a83773c..bf11b50ab5 100644 --- a/operator/administration/index.html +++ b/operator/administration/index.html @@ -9,8 +9,8 @@ - - + +
    +
        secretMounts:
    - secretFullName: hotfix-conveyor-poller-patch
    mountPath: /patch/hotfix_conveyor_poller.patch
    subPath: hotfix_conveyor_poller.patch
    \ No newline at end of file diff --git a/operator/configuration/index.html b/operator/configuration/index.html index 5c9d70a436..dfd38bd3a9 100644 --- a/operator/configuration/index.html +++ b/operator/configuration/index.html @@ -9,8 +9,8 @@ - - + +
    +
      $ rucio-admin account set-limits jdoe SITE3_DISK 10000000000000
    Set account limit for account jdoe on SITE3_DISK: 10.000 TB
    $ rucio-admin account get-limits jdoe SITE3_DISK
    Quota on SITE3_DISK for jdoe : 10 TB
    \ No newline at end of file diff --git a/operator/configuration_parameters/index.html b/operator/configuration_parameters/index.html index 4590c4273e..3c06945edb 100644 --- a/operator/configuration_parameters/index.html +++ b/operator/configuration_parameters/index.html @@ -9,8 +9,8 @@ - - + +

    Configuration parameters

    Description of the configuration parameters splitted in three different places: @@ -717,6 +717,6 @@

    RSE attribute
  • tier: Datacenter TIER. Integer (from 1 to 4). No default.
  • type: Values: {LOCALGROUPDISK, LOCALGROUPTAPE, GROUPDISK, SCRATCHDISK, MOCK, TEST, DATADISK}. Default: .
  • verify_checksum: Boolean. No default.
  • -

    +
    \ No newline at end of file diff --git a/operator/database/index.html b/operator/database/index.html index af84a67ce9..d821eb601b 100644 --- a/operator/database/index.html +++ b/operator/database/index.html @@ -9,8 +9,8 @@ - - + + +3

    \ No newline at end of file diff --git a/operator/did_meta/index.html b/operator/did_meta/index.html index ce8ba67945..fb775105fb 100644 --- a/operator/did_meta/index.html +++ b/operator/did_meta/index.html @@ -9,8 +9,8 @@ - - + +

    DID Metadata

    Rucio supports adding Metadata on the dids.

    @@ -36,6 +36,6 @@

    get_metadata(scope, name, session=None)
    """
    Returns metadata stored in Plugin for given scope:name
    """

    set_metadata(scope, name, key, value, recursive, session=None)
    """
    Sets the metadata in Plugin for given scope:name
    """

    delete_metadata(scope, name, key, session=None)
    """
    Removes the metadata from the Plugin for given scope:name
    """

    list_dids(scope, filters, type='collection', ignore_case=False, limit=None, \
    offset=None, long=False, recursive=False, session=None)
    """
    Returns a list of dids for given filters.
    For long = True return should be a list of dictionaries having the keys 'scope',
    'name', 'did_type', 'bytes', 'length'.
    For long = False return should be a list of strings containing the did names.
    """

    manages_key(key, session=None)
    """
    Returns if Plugin is willing to manage metadata with given KEY.
    Some Plugins might decide to accept only specific hardcoded keys, others might match
    against a particular regex while other might accept all possible keys.
    """

    How to configure which metadata plugin to use

    Configuration options for Metadata are:

    -
    [metadata]
    # plugins = list_of_plugins,comma_separated
    plugins = rucio.core.did_meta_plugins.did_column_meta.DidColumnMeta,escape.rucio.did_meta_plugin
    +
    [metadata]
    # plugins = list_of_plugins,comma_separated
    plugins = rucio.core.did_meta_plugins.did_column_meta.DidColumnMeta,escape.rucio.did_meta_plugin
    \ No newline at end of file diff --git a/operator/installing_daemons/index.html b/operator/installing_daemons/index.html index d188252694..06e0561266 100644 --- a/operator/installing_daemons/index.html +++ b/operator/installing_daemons/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/installing_server/index.html b/operator/installing_server/index.html index 1c3f5e3944..a18b16fb79 100644 --- a/operator/installing_server/index.html +++ b/operator/installing_server/index.html @@ -9,8 +9,8 @@ - - + +
    +
    \ No newline at end of file diff --git a/operator/k8s_guide/index.html b/operator/k8s_guide/index.html index 8b16bafed0..3b32b436c9 100644 --- a/operator/k8s_guide/index.html +++ b/operator/k8s_guide/index.html @@ -9,8 +9,8 @@ - - + +
    +
    rucio add-dataset test:dataset3
    rucio attach test:dataset3 test:file4
    \ No newline at end of file diff --git a/operator/kubernetes/index.html b/operator/kubernetes/index.html index 81bf5bac14..39275788bd 100644 --- a/operator/kubernetes/index.html +++ b/operator/kubernetes/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up Rucio on Kubernetes

    Helm charts

    @@ -47,6 +47,6 @@

    Upgra
    cat alembic.ini | kubectl exec -i rucio-server-<pod identifier> --container rucio-server -- tee /tmp/alembic.ini

    Open a bash prompt on the pod

    kubectl exec rucio-server-<pod identifier> --container rucio-server -it -- bash
    -

    Then perform the upgrade with the Alembic tool as described in the database documentation

    +

    Then perform the upgrade with the Alembic tool as described in the database documentation

    \ No newline at end of file diff --git a/operator/monitoring/index.html b/operator/monitoring/index.html index 38d8d0a9fd..d8ab59ae30 100644 --- a/operator/monitoring/index.html +++ b/operator/monitoring/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/multi_vo_rucio/index.html b/operator/multi_vo_rucio/index.html index 6356fb5be9..436ee19dcf 100644 --- a/operator/multi_vo_rucio/index.html +++ b/operator/multi_vo_rucio/index.html @@ -9,8 +9,8 @@ - - + + +
    $ python
    >>> from rucio.common.types import InternalAccount
    >>> from rucio.core.account import del_account
    >>> del_account(InternalAccount('super_root', vo='def'))
    \ No newline at end of file diff --git a/operator/notifications/index.html b/operator/notifications/index.html index 78a6fb0ddb..c3c9ed8c77 100644 --- a/operator/notifications/index.html +++ b/operator/notifications/index.html @@ -9,8 +9,8 @@ - - + +

    Notifications

    Notifications

    @@ -18,6 +18,6 @@ These notifications are primarily useful to other systems for synchronisation purposes, e.g., notifying a workflow management system that a dataset has finished transferring or has been deleted.

    Rucio Notifications

    The events generated by Rucio are categorized into different event types. Each event type has a different payload.

    -
    ContextEvent TypePayload example
    While adding a DID, if the DID type is a ContainerCREATE_CNT{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    While adding a DID, if the DID type is a DataSetCREATE_DTS{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    Submit transfer requests on destination RSEs for data identifiers.transfer_status{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}
    Schedule removal of the entry from the DIDs tableINCOMPLETE-
    Delete empty DIDs where the DIDType is DATASETERASE{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}
    When the replication rule transitioning into OK_STATE for DIDs which are closedRULE_OK{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    For replication replication rule, for each 10% of progressRULE_PROGRESS{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    When the replication rule transitioning into OK_STATE for each DATASET covered by the ruleDATASETLOCK_OK{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}
    When a transfer has been completedtransfer-done{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a transfer has been failtransfer-failed{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been successfuldeletion-done{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been faildeletion-failed{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    +
    ContextEvent TypePayload example
    While adding a DID, if the DID type is a ContainerCREATE_CNT{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    While adding a DID, if the DID type is a DataSetCREATE_DTS{'account': 'ruciouser', 'scope': 'data', 'name': 'this.is.a.dataset', 'expired_at': '2023-07-05 14:51:55.378549' or None}
    Submit transfer requests on destination RSEs for data identifiers.transfer_status{'request-id': '414ac0cd34844a03a184ce4b0f640dd1', 'request-type': 'transfer', 'scope': 'data', 'name': 'this.is.a.test.file', 'dst-rse-id': '207228dfe3b246ab9d8b199c8358e864', 'dst-rse': 'TESTRSE', 'state': 'QUEUED', 'retry-count': 2, 'rule-id': '8f06b8ede5024e9fb8c1aa4d761627f0', 'activity': 'User Subscription', 'file-size': 1000000, 'bytes': 1000000,'checksum-md5': '9e107d9d372bb6826bd81d3542a419d6', 'checksum-adler': '08880271', 'queued_at': '2023-07-05 14:51:55.378549'}
    Schedule removal of the entry from the DIDs tableINCOMPLETE-
    Delete empty DIDs where the DIDType is DATASETERASE{'scope': 'data', 'name': 'this.is.a.dataset','account': 'root'}
    When the replication rule transitioning into OK_STATE for DIDs which are closedRULE_OK{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    For replication replication rule, for each 10% of progressRULE_PROGRESS{'scope': 'data','name': 'this.is.a.dataset','rule_id': '18432d3c5aad43e3a4ed10ff61e5d1ce','progress': 30,'vo': 'testvo'}
    When the replication rule transitioning into OK_STATE for each DATASET covered by the ruleDATASETLOCK_OK{'scope': 'data','name': 'this.is.a.dataset','rse': 'TESTRSE', 'rse_id': '3ddb29c028574f7288595711bc83f3e6''vo': 'testvo'}
    When a transfer has been completedtransfer-done{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a transfer has been failtransfer-failed{'scope': 'data','name': 'this.is.a.dataset', 'src-rse': 'TESTRSE', 'dst-rse': 'TESTRSE', 'activity': 'User Subscription', 'request-id': None, 'transfer-id': None, 'created_at': '2023-07-05 14:51:55.378549', 'transferred_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been successfuldeletion-done{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    When a deletion has been faildeletion-failed{'scope': 'data','name': 'this.is.a.dataset', 'rse': 'TESTRSE','request-id': None, 'url': None,'bytes': 1000000, 'created_at': '2023-07-05 14:51:55.378549'}
    \ No newline at end of file diff --git a/operator/policy_packages/index.html b/operator/policy_packages/index.html index d1ee7b5810..e71edab726 100644 --- a/operator/policy_packages/index.html +++ b/operator/policy_packages/index.html @@ -9,8 +9,8 @@ - - + +
    +
    config:
    policy:
    package: packagename
    \ No newline at end of file diff --git a/operator/qos_rse_config/index.html b/operator/qos_rse_config/index.html index 536a7e2add..aa4c1fbcb2 100644 --- a/operator/qos_rse_config/index.html +++ b/operator/qos_rse_config/index.html @@ -9,8 +9,8 @@ - - + +
    +
                                    .
    .
    Settings:
    =========
    rse: <RSE>
    rse_type: DISK
    .
    .
    \ No newline at end of file diff --git a/operator/s3_rse_config/index.html b/operator/s3_rse_config/index.html index a958fbc1ae..ccef8e84a3 100644 --- a/operator/s3_rse_config/index.html +++ b/operator/s3_rse_config/index.html @@ -9,8 +9,8 @@ - - + +

    S3 Storage Configuration

    S3 Storage Configuration (FTS3 & GFAL2)

    @@ -74,6 +74,6 @@

    Rucio S
  • When the conveyor-submitter daemon submits a transfer to FTS3, it does not pre-sign the URL but it depends on the FTS3 server to do so (Step 5 of the configuration in the previous section), in this case the proper scheme to use for the protocol is s3s://, Rucio will automatically translate https -> s3s in order to submit the transfer properly. The approach of not pre-signing the URL is necessary since those URLs have an expiration time and there is no guarantee of when the FTS3 transfer will really happen. This way, FTS3 signs the URL just before the transfer actually starts.

  • -

    +
    \ No newline at end of file diff --git a/operator/setting_up_demo/index.html b/operator/setting_up_demo/index.html index 6c21ae0462..95b9c63d9b 100644 --- a/operator/setting_up_demo/index.html +++ b/operator/setting_up_demo/index.html @@ -9,8 +9,8 @@ - - + +

    Setting up a Rucio demo environment

    Prerequisites

    @@ -203,6 +203,6 @@

    rucio rule-info 1aadd685d891400dba050ad43e71fea9|grep Locks
    Locks OK/REPLICATING/STUCK: 4/0/0**

    And if we look at the replicas of the dataset, we see the there are replicas of the files also in XRD3:

    -
    $ rucio list-file-replicas test:mynewdataset
    +-------+-------+-----------+----------+-----------------------------------+
    | SCOPE | NAME | FILESIZE | ADLER32 | RSE: REPLICA |
    |-------|-------|-----------|----------|-----------------------------------|
    | test | file1 | 10.486 MB | 141a641e | XRD3: root://xrd3:1096//rucio/... |
    | test | file1 | 10.486 MB | 141a641e | XRD1: root://xrd1:1094//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD3: root://xrd3:1096//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD1: root://xrd1:1094//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD2: root://xrd2:1095//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD3: root://xrd3:1096//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD2: root://xrd2:1095//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD3: root://xrd3:1096//rucio/... |
    +-------+-------+-----------+----------+-----------------------------------+
    +
    $ rucio list-file-replicas test:mynewdataset
    +-------+-------+-----------+----------+-----------------------------------+
    | SCOPE | NAME | FILESIZE | ADLER32 | RSE: REPLICA |
    |-------|-------|-----------|----------|-----------------------------------|
    | test | file1 | 10.486 MB | 141a641e | XRD3: root://xrd3:1096//rucio/... |
    | test | file1 | 10.486 MB | 141a641e | XRD1: root://xrd1:1094//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD3: root://xrd3:1096//rucio/... |
    | test | file2 | 10.486 MB | fdfa7eea | XRD1: root://xrd1:1094//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD2: root://xrd2:1095//rucio/... |
    | test | file3 | 10.486 MB | c669167d | XRD3: root://xrd3:1096//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD2: root://xrd2:1095//rucio/... |
    | test | file4 | 10.486 MB | 65786e49 | XRD3: root://xrd3:1096//rucio/... |
    +-------+-------+-----------+----------+-----------------------------------+
    \ No newline at end of file diff --git a/operator/transfers/configure-rucio-fts3-plugins/index.html b/operator/transfers/configure-rucio-fts3-plugins/index.html index e50ef38e42..29a1af6316 100644 --- a/operator/transfers/configure-rucio-fts3-plugins/index.html +++ b/operator/transfers/configure-rucio-fts3-plugins/index.html @@ -9,8 +9,8 @@ - - + +

    Configure A Tool to Determine Rules For FTS3 Tape Transfers

    Rucio includes functionality to pass instructions to FTS3 that describe how the transfer should be concluded @@ -39,10 +39,10 @@

    Configuration

    -

    Configuration set in the rucio.cfg. To use a plugin (here named "policy_algorithm"), +

    Configuration set in the rucio.cfg. To use a plugin (here named policy_algorithm_1), modify the config to include the below field. To use multiple plugins, their names can be listed to make each plugin algorithm run in sequence.

    -
    [transfers]
    fts3tape_metadata_plugins = ["policy_algorithm"]
    +
    [transfers]
    fts3tape_metadata_plugins = policy_algorithm_1, policy_algorithm_2

    Size constraints can be set with the below. (Default of 4096)

    [transfers]
    metadata_byte_limit = <byte limit of transfer metadata>

    Pre-built plugins

    @@ -53,7 +53,7 @@

    {"archive_metadata": {"scheduling_hints": {"priority": 0}}}

    The plugin requires no code modification or subclassing, all set up is done in the rucio.cfg.

    To set up, update your configuration as follows:

    -
    [transfers]
    fts3tape_metadata_plugins = ["activity"]

    [tape_priority]
    <Activity 1> = 100
    <Activity 2> = 80
    <Activity 3> = 50
    +
    [transfers]
    fts3tape_metadata_plugins = policy_algorithm

    [tape_priority]
    <Activity 1> = 100
    <Activity 2> = 80
    <Activity 3> = 50

    Baseline priority for any activity not listed is 20.

    Tape Collocation

    In order to ensure data is placed on tape with similar data, a tape_collocation plugin can be used. @@ -64,6 +64,6 @@

    Tape Colloc

    If the collocation wrapper is used, this format is verified and put into the collocation_hints field of the transfer parameters. This is done below, where find_level_hints is an arbitrary function written for an experiment's needs:

    -
    from rucio.transfertool.fts3_plugins import FTS3TapeMetadataPlugin

    class ExperimentCollocationFTSPlugins(FTS3TapeMetadataPlugin):
    def __init__(self, policy_algorithm="def"):
    super().__init__(policy_algorithm)
    self.register(
    "policy_collocation_algorithm",
    func= lambda x: self._collocation(self._experiment_plugin, x)
    )

    def find_level_hints(self, level, hints):
    ...

    def _experiment_plugin(self, *hints):
    return {
    "0": self.find_level_hints(level=0, hints=hints),
    "1": self.find_level_hints(level=1, hints=hints),
    "2": self.find_level_hints(level=2, hints=hints),
    "3": self.find_level_hints(level=3, hints=hints),
    }

    ExperimentCollocationFTSPlugins("def")

    +
    from rucio.transfertool.fts3_plugins import FTS3TapeMetadataPlugin

    class ExperimentCollocationFTSPlugins(FTS3TapeMetadataPlugin):
    def __init__(self, policy_algorithm="def"):
    super().__init__(policy_algorithm)
    self.register(
    "policy_collocation_algorithm",
    func= lambda x: self._collocation(self._experiment_plugin, x)
    )

    def find_level_hints(self, level, hints):
    ...

    def _experiment_plugin(self, *hints):
    return {
    "0": self.find_level_hints(level=0, hints=hints),
    "1": self.find_level_hints(level=1, hints=hints),
    "2": self.find_level_hints(level=2, hints=hints),
    "3": self.find_level_hints(level=3, hints=hints),
    }

    ExperimentCollocationFTSPlugins("def")
    \ No newline at end of file diff --git a/operator/transfers/configure-rucio-globus/index.html b/operator/transfers/configure-rucio-globus/index.html index 0888224e8e..918a80d0d1 100644 --- a/operator/transfers/configure-rucio-globus/index.html +++ b/operator/transfers/configure-rucio-globus/index.html @@ -9,8 +9,8 @@ - - + +

    Configure Rucio To Use Globus Online as a Transfer Tool

    This document walks through an example configuration of Rucio to use Globus @@ -67,6 +67,6 @@

    Gl

    The Globus configuration file ./lib/rucio/transfertool/config.yml is a file of YAML syntax and should include at minimum the registered application name, the client ID and refresh token:

    -
    globus:
    apps:
    RucioGlobusXferNativeApp:
    client_id: a758...
    refresh_token: Agjo...

    +
    globus:
    apps:
    RucioGlobusXferNativeApp:
    client_id: a758...
    refresh_token: Agjo...
    \ No newline at end of file diff --git a/operator/transfers/transfers-overview/index.html b/operator/transfers/transfers-overview/index.html index 6337be50f7..980869cf5a 100644 --- a/operator/transfers/transfers-overview/index.html +++ b/operator/transfers/transfers-overview/index.html @@ -9,8 +9,8 @@ - - + + +

    Request State Transition Chart

    \ No newline at end of file diff --git a/operator/transfers/transfers-preparer/index.html b/operator/transfers/transfers-preparer/index.html index 9ce953ac32..992475e51c 100644 --- a/operator/transfers/transfers-preparer/index.html +++ b/operator/transfers/transfers-preparer/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/operator/transfers/transfers-submitter/index.html b/operator/transfers/transfers-submitter/index.html index 149ba832a1..95912bed9a 100644 --- a/operator/transfers/transfers-submitter/index.html +++ b/operator/transfers/transfers-submitter/index.html @@ -9,8 +9,8 @@ - - + +

    Transfers Submitter

    The conveyor-submitter (transfer submitter) is the rucio daemon in charge @@ -44,6 +44,6 @@ attribute on both source and destination RSE.

    If a path can be submitted, all missing hops are created into the database, and submitter goes to the submission step, which is straightforward and -consists of calling the transfertool with the correct arguments.

    +consists of calling the transfertool with the correct arguments.

    \ No newline at end of file diff --git a/operator/transfers/transfers-throttler/index.html b/operator/transfers/transfers-throttler/index.html index 89ed655033..7f7401f227 100644 --- a/operator/transfers/transfers-throttler/index.html +++ b/operator/transfers/transfers-throttler/index.html @@ -9,8 +9,8 @@ - - + + +The only technique we use in production is destination throttling.

    \ No newline at end of file diff --git a/project_organisation/index.html b/project_organisation/index.html index b29717f677..c3b3873bf5 100644 --- a/project_organisation/index.html +++ b/project_organisation/index.html @@ -9,8 +9,8 @@ - - + +

    Project Organisation

    Rucio is organised as a community-driven, open-source, project. @@ -53,6 +53,6 @@

    Spec

    Detailed information for Rucio SIGs can be found here.

    Contributors / Developers

    Rucio could not exist without the numerous contributors who spent their valuable time -to improve the software. A list of contributors can be seen here.

    +to improve the software. A list of contributors can be seen here.

    \ No newline at end of file diff --git a/release-notes/1.13.3/index.html b/release-notes/1.13.3/index.html index 6d110bb186..d490939c49 100644 --- a/release-notes/1.13.3/index.html +++ b/release-notes/1.13.3/index.html @@ -9,8 +9,8 @@ - - + +

    Bugs

    diff --git a/release-notes/1.14.0.post1/index.html b/release-notes/1.14.0.post1/index.html index aa9b2dc12b..5abde5e928 100644 --- a/release-notes/1.14.0.post1/index.html +++ b/release-notes/1.14.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.0.post1

    Rucio

    diff --git a/release-notes/1.14.1.post1/index.html b/release-notes/1.14.1.post1/index.html index 4c484e9e78..3236cacc36 100644 --- a/release-notes/1.14.1.post1/index.html +++ b/release-notes/1.14.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.1.post1

    Rucio

    diff --git a/release-notes/1.14.10/index.html b/release-notes/1.14.10/index.html index d67a09ba41..0ae39ea6a8 100644 --- a/release-notes/1.14.10/index.html +++ b/release-notes/1.14.10/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/release-notes/1.14.11/index.html b/release-notes/1.14.11/index.html index e1b4af662e..d8ecfa8dff 100644 --- a/release-notes/1.14.11/index.html +++ b/release-notes/1.14.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.11

    Clients

    diff --git a/release-notes/1.14.2/index.html b/release-notes/1.14.2/index.html index 01553ad978..e68a6b383e 100644 --- a/release-notes/1.14.2/index.html +++ b/release-notes/1.14.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.2

    Rucio

    diff --git a/release-notes/1.14.3/index.html b/release-notes/1.14.3/index.html index 505e3c403d..25abce97b8 100644 --- a/release-notes/1.14.3/index.html +++ b/release-notes/1.14.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.3

    Clients

    diff --git a/release-notes/1.14.4/index.html b/release-notes/1.14.4/index.html index caf302fee9..d4a3ff4312 100644 --- a/release-notes/1.14.4/index.html +++ b/release-notes/1.14.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.4

    Clients

    diff --git a/release-notes/1.14.5/index.html b/release-notes/1.14.5/index.html index c6b5bb3b9a..3b9d34029c 100644 --- a/release-notes/1.14.5/index.html +++ b/release-notes/1.14.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.5

    Clients

    diff --git a/release-notes/1.14.6/index.html b/release-notes/1.14.6/index.html index b33ce10087..f108a1fa6a 100644 --- a/release-notes/1.14.6/index.html +++ b/release-notes/1.14.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.6

    Rucio

    diff --git a/release-notes/1.14.7/index.html b/release-notes/1.14.7/index.html index 4998533834..2a73571792 100644 --- a/release-notes/1.14.7/index.html +++ b/release-notes/1.14.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.7

    Rucio

    diff --git a/release-notes/1.14.8.post1/index.html b/release-notes/1.14.8.post1/index.html index e109989c84..f1dada5b2a 100644 --- a/release-notes/1.14.8.post1/index.html +++ b/release-notes/1.14.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8.post1

    Rucio

    diff --git a/release-notes/1.14.8.post2/index.html b/release-notes/1.14.8.post2/index.html index d260366426..d440bf52c5 100644 --- a/release-notes/1.14.8.post2/index.html +++ b/release-notes/1.14.8.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8.post2

    Rucio

    diff --git a/release-notes/1.14.8/index.html b/release-notes/1.14.8/index.html index 71e011897a..e6ad650b45 100644 --- a/release-notes/1.14.8/index.html +++ b/release-notes/1.14.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.8

    Rucio

    diff --git a/release-notes/1.14.9.post1/index.html b/release-notes/1.14.9.post1/index.html index 6330ea247f..57bfac98f8 100644 --- a/release-notes/1.14.9.post1/index.html +++ b/release-notes/1.14.9.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.9.post1

    Rucio

    diff --git a/release-notes/1.14.9/index.html b/release-notes/1.14.9/index.html index 859a09b6c9..6313f501db 100644 --- a/release-notes/1.14.9/index.html +++ b/release-notes/1.14.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.14.9

    Rucio

    diff --git a/release-notes/1.15.0.post1/index.html b/release-notes/1.15.0.post1/index.html index 1acda18c01..95dda3c5e9 100644 --- a/release-notes/1.15.0.post1/index.html +++ b/release-notes/1.15.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.0.post1

    Rucio

    diff --git a/release-notes/1.15.0/index.html b/release-notes/1.15.0/index.html index c6a9631d06..7ae54027a2 100644 --- a/release-notes/1.15.0/index.html +++ b/release-notes/1.15.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.0

    Rucio

    diff --git a/release-notes/1.15.1/index.html b/release-notes/1.15.1/index.html index 1a4aa5e2b6..bcb525a031 100644 --- a/release-notes/1.15.1/index.html +++ b/release-notes/1.15.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.1

    WebUI

    diff --git a/release-notes/1.15.2/index.html b/release-notes/1.15.2/index.html index f1421e8d40..0f5216641c 100644 --- a/release-notes/1.15.2/index.html +++ b/release-notes/1.15.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.2

    Rucio

    diff --git a/release-notes/1.15.3.post1/index.html b/release-notes/1.15.3.post1/index.html index 802b2e8eee..1c4ec9d3fd 100644 --- a/release-notes/1.15.3.post1/index.html +++ b/release-notes/1.15.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.3.post1

    General

    diff --git a/release-notes/1.15.3/index.html b/release-notes/1.15.3/index.html index e97a58d619..a04488fce9 100644 --- a/release-notes/1.15.3/index.html +++ b/release-notes/1.15.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.3

    General

    diff --git a/release-notes/1.15.4.post1/index.html b/release-notes/1.15.4.post1/index.html index f263671e63..2f81a16d28 100644 --- a/release-notes/1.15.4.post1/index.html +++ b/release-notes/1.15.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.4.post1

    General

    diff --git a/release-notes/1.15.4/index.html b/release-notes/1.15.4/index.html index fa7c6adf66..388e411dfa 100644 --- a/release-notes/1.15.4/index.html +++ b/release-notes/1.15.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.4

    Upgrade instructions

    diff --git a/release-notes/1.15.5/index.html b/release-notes/1.15.5/index.html index db536e2a4d..d83f07eed0 100644 --- a/release-notes/1.15.5/index.html +++ b/release-notes/1.15.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.15.5

    Clients

    diff --git a/release-notes/1.16.0.post1/index.html b/release-notes/1.16.0.post1/index.html index 3936d20690..5b4a765ce7 100644 --- a/release-notes/1.16.0.post1/index.html +++ b/release-notes/1.16.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.0.post1

    General

    diff --git a/release-notes/1.16.0/index.html b/release-notes/1.16.0/index.html index 56b3cf7173..a3c0e45056 100644 --- a/release-notes/1.16.0/index.html +++ b/release-notes/1.16.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.0

    General

    diff --git a/release-notes/1.16.1/index.html b/release-notes/1.16.1/index.html index 796d661b2c..b185bf9dce 100644 --- a/release-notes/1.16.1/index.html +++ b/release-notes/1.16.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.1

    General

    diff --git a/release-notes/1.16.2/index.html b/release-notes/1.16.2/index.html index eafcb7f50a..cb5128ac2f 100644 --- a/release-notes/1.16.2/index.html +++ b/release-notes/1.16.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.2

    General

    diff --git a/release-notes/1.16.3/index.html b/release-notes/1.16.3/index.html index d97717a534..d4f8e84bcc 100644 --- a/release-notes/1.16.3/index.html +++ b/release-notes/1.16.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.3

    General

    diff --git a/release-notes/1.16.4/index.html b/release-notes/1.16.4/index.html index ddc3ded947..fc9832b9ca 100644 --- a/release-notes/1.16.4/index.html +++ b/release-notes/1.16.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.16.4

    Clients

    diff --git a/release-notes/1.17.0/index.html b/release-notes/1.17.0/index.html index 9e74ae02a7..c9e16ffa4b 100644 --- a/release-notes/1.17.0/index.html +++ b/release-notes/1.17.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.0

    General

    diff --git a/release-notes/1.17.1/index.html b/release-notes/1.17.1/index.html index dc80e697f6..de2a56eda5 100644 --- a/release-notes/1.17.1/index.html +++ b/release-notes/1.17.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.1

    General

    diff --git a/release-notes/1.17.2.post1/index.html b/release-notes/1.17.2.post1/index.html index 84df342915..78da2b47e1 100644 --- a/release-notes/1.17.2.post1/index.html +++ b/release-notes/1.17.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.2.post1

    General

    diff --git a/release-notes/1.17.2/index.html b/release-notes/1.17.2/index.html index 1229b38351..1151eef9df 100644 --- a/release-notes/1.17.2/index.html +++ b/release-notes/1.17.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.2

    General

    diff --git a/release-notes/1.17.3/index.html b/release-notes/1.17.3/index.html index 9c31dc67eb..e5465a7a1e 100644 --- a/release-notes/1.17.3/index.html +++ b/release-notes/1.17.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.3

    Clients

    diff --git a/release-notes/1.17.4/index.html b/release-notes/1.17.4/index.html index d290afc522..235908e253 100644 --- a/release-notes/1.17.4/index.html +++ b/release-notes/1.17.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.4

    Clients

    diff --git a/release-notes/1.17.5/index.html b/release-notes/1.17.5/index.html index 40b58d33d0..b19bc779c8 100644 --- a/release-notes/1.17.5/index.html +++ b/release-notes/1.17.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.5

    General

    diff --git a/release-notes/1.17.6.post1/index.html b/release-notes/1.17.6.post1/index.html index c8895bdc6b..ccbe0fa79c 100644 --- a/release-notes/1.17.6.post1/index.html +++ b/release-notes/1.17.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6.post1

    General

    diff --git a/release-notes/1.17.6.post2/index.html b/release-notes/1.17.6.post2/index.html index 9b65a80fa8..92588c7c6b 100644 --- a/release-notes/1.17.6.post2/index.html +++ b/release-notes/1.17.6.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6.post2

    General

    diff --git a/release-notes/1.17.6/index.html b/release-notes/1.17.6/index.html index 3802ea8dc2..2e5bf74df7 100644 --- a/release-notes/1.17.6/index.html +++ b/release-notes/1.17.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.6

    General

    diff --git a/release-notes/1.17.7/index.html b/release-notes/1.17.7/index.html index 8da8cfd440..1435c93ae0 100644 --- a/release-notes/1.17.7/index.html +++ b/release-notes/1.17.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.7

    General

    diff --git a/release-notes/1.17.8.post1/index.html b/release-notes/1.17.8.post1/index.html index d161fcf168..fd2cfd8de5 100644 --- a/release-notes/1.17.8.post1/index.html +++ b/release-notes/1.17.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8.post1

    Clients

    diff --git a/release-notes/1.17.8.post2/index.html b/release-notes/1.17.8.post2/index.html index 19f42d9761..8e7820a91f 100644 --- a/release-notes/1.17.8.post2/index.html +++ b/release-notes/1.17.8.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8.post2

    Clients

    diff --git a/release-notes/1.17.8/index.html b/release-notes/1.17.8/index.html index b3c07f667b..191cdff102 100644 --- a/release-notes/1.17.8/index.html +++ b/release-notes/1.17.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.17.8

    General

    diff --git a/release-notes/1.18.0/index.html b/release-notes/1.18.0/index.html index d266741f68..bfc8fa04d9 100644 --- a/release-notes/1.18.0/index.html +++ b/release-notes/1.18.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.0

    Upgrade instructions

    diff --git a/release-notes/1.18.1/index.html b/release-notes/1.18.1/index.html index 7531fc862f..ee98a51a6e 100644 --- a/release-notes/1.18.1/index.html +++ b/release-notes/1.18.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.1

    General

    diff --git a/release-notes/1.18.2/index.html b/release-notes/1.18.2/index.html index 67e2f32df1..8e0bb17a99 100644 --- a/release-notes/1.18.2/index.html +++ b/release-notes/1.18.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.2

    Clients

    diff --git a/release-notes/1.18.3/index.html b/release-notes/1.18.3/index.html index 29f9a9f242..2f11af135e 100644 --- a/release-notes/1.18.3/index.html +++ b/release-notes/1.18.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.3

    General

    diff --git a/release-notes/1.18.4/index.html b/release-notes/1.18.4/index.html index 0f16930ae7..3a034df064 100644 --- a/release-notes/1.18.4/index.html +++ b/release-notes/1.18.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.4

    General

    diff --git a/release-notes/1.18.5.post1/index.html b/release-notes/1.18.5.post1/index.html index 8a69ea25c5..6b2c049de3 100644 --- a/release-notes/1.18.5.post1/index.html +++ b/release-notes/1.18.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.5.post1

    General

    diff --git a/release-notes/1.18.5/index.html b/release-notes/1.18.5/index.html index 2385d5c1ed..4135365fe7 100644 --- a/release-notes/1.18.5/index.html +++ b/release-notes/1.18.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.5

    General

    diff --git a/release-notes/1.18.6.post1/index.html b/release-notes/1.18.6.post1/index.html index 9f2c320a16..05f85c5919 100644 --- a/release-notes/1.18.6.post1/index.html +++ b/release-notes/1.18.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.6.post1

    General

    diff --git a/release-notes/1.18.6/index.html b/release-notes/1.18.6/index.html index 7f358c55a7..711dee70bb 100644 --- a/release-notes/1.18.6/index.html +++ b/release-notes/1.18.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.6

    General

    diff --git a/release-notes/1.18.7/index.html b/release-notes/1.18.7/index.html index f0536f2705..613442c1d5 100644 --- a/release-notes/1.18.7/index.html +++ b/release-notes/1.18.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.7

    General

    diff --git a/release-notes/1.18.8.post1/index.html b/release-notes/1.18.8.post1/index.html index 5e971c4547..d6f9d92d4d 100644 --- a/release-notes/1.18.8.post1/index.html +++ b/release-notes/1.18.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.8.post1

    General

    diff --git a/release-notes/1.18.8/index.html b/release-notes/1.18.8/index.html index eb037b2aeb..ae883643f6 100644 --- a/release-notes/1.18.8/index.html +++ b/release-notes/1.18.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.8

    General

    diff --git a/release-notes/1.18.9/index.html b/release-notes/1.18.9/index.html index 7aafba0af6..939b23a4a3 100644 --- a/release-notes/1.18.9/index.html +++ b/release-notes/1.18.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.18.9

    General

    diff --git a/release-notes/1.19.0.post2/index.html b/release-notes/1.19.0.post2/index.html index 10e0af9a89..a24ec121cb 100644 --- a/release-notes/1.19.0.post2/index.html +++ b/release-notes/1.19.0.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.0.post2

    Upgrade Instructions

    diff --git a/release-notes/1.19.1/index.html b/release-notes/1.19.1/index.html index 0c2a21f88e..c4dd1b0089 100644 --- a/release-notes/1.19.1/index.html +++ b/release-notes/1.19.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.1

    General

    diff --git a/release-notes/1.19.2/index.html b/release-notes/1.19.2/index.html index ac01c4bdce..0e33fdb08e 100644 --- a/release-notes/1.19.2/index.html +++ b/release-notes/1.19.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.2

    WebUI

    diff --git a/release-notes/1.19.3/index.html b/release-notes/1.19.3/index.html index 4639795477..b3c20447c0 100644 --- a/release-notes/1.19.3/index.html +++ b/release-notes/1.19.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.3

    General

    diff --git a/release-notes/1.19.4.post1/index.html b/release-notes/1.19.4.post1/index.html index ee8697cdcb..45ed36e5d2 100644 --- a/release-notes/1.19.4.post1/index.html +++ b/release-notes/1.19.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4.post1

    General

    diff --git a/release-notes/1.19.4.post2/index.html b/release-notes/1.19.4.post2/index.html index b5242ed1ac..93eac7579c 100644 --- a/release-notes/1.19.4.post2/index.html +++ b/release-notes/1.19.4.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4.post2

    General

    diff --git a/release-notes/1.19.4/index.html b/release-notes/1.19.4/index.html index 5681d4e38b..dbd448f05d 100644 --- a/release-notes/1.19.4/index.html +++ b/release-notes/1.19.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.4

    General

    diff --git a/release-notes/1.19.5/index.html b/release-notes/1.19.5/index.html index b583ee9c46..99086bf2fe 100644 --- a/release-notes/1.19.5/index.html +++ b/release-notes/1.19.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.5

    General

    diff --git a/release-notes/1.19.6/index.html b/release-notes/1.19.6/index.html index 09c9f43f16..ae315913f4 100644 --- a/release-notes/1.19.6/index.html +++ b/release-notes/1.19.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.6

    General

    diff --git a/release-notes/1.19.7.post1/index.html b/release-notes/1.19.7.post1/index.html index ede2178db6..830d152f23 100644 --- a/release-notes/1.19.7.post1/index.html +++ b/release-notes/1.19.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.7.post1

    General

    diff --git a/release-notes/1.19.7/index.html b/release-notes/1.19.7/index.html index a30341a853..698db9a3e7 100644 --- a/release-notes/1.19.7/index.html +++ b/release-notes/1.19.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.7

    General

    diff --git a/release-notes/1.19.8/index.html b/release-notes/1.19.8/index.html index c7b9a452e8..1deaf8ea3d 100644 --- a/release-notes/1.19.8/index.html +++ b/release-notes/1.19.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.19.8

    General

    diff --git a/release-notes/1.20.0/index.html b/release-notes/1.20.0/index.html index 2f6786ea51..6b5cae6970 100644 --- a/release-notes/1.20.0/index.html +++ b/release-notes/1.20.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.20.0rc1/index.html b/release-notes/1.20.0rc1/index.html index 2f950cf913..d6f0e87bc5 100644 --- a/release-notes/1.20.0rc1/index.html +++ b/release-notes/1.20.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.0rc1

    Release Candidate

    diff --git a/release-notes/1.20.1.post1/index.html b/release-notes/1.20.1.post1/index.html index de5794e12b..4dac96108f 100644 --- a/release-notes/1.20.1.post1/index.html +++ b/release-notes/1.20.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.1.post1

    General

    diff --git a/release-notes/1.20.1/index.html b/release-notes/1.20.1/index.html index 165ef20e59..aff36afcc7 100644 --- a/release-notes/1.20.1/index.html +++ b/release-notes/1.20.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.1

    General

    diff --git a/release-notes/1.20.10/index.html b/release-notes/1.20.10/index.html index 99163153ed..11184d13ed 100644 --- a/release-notes/1.20.10/index.html +++ b/release-notes/1.20.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.10

    General

    diff --git a/release-notes/1.20.11/index.html b/release-notes/1.20.11/index.html index a02b67b00b..fb2b2c4bcf 100644 --- a/release-notes/1.20.11/index.html +++ b/release-notes/1.20.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.11

    General

    diff --git a/release-notes/1.20.12/index.html b/release-notes/1.20.12/index.html index a9175d07c4..b226544168 100644 --- a/release-notes/1.20.12/index.html +++ b/release-notes/1.20.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.12

    General

    diff --git a/release-notes/1.20.13/index.html b/release-notes/1.20.13/index.html index 086b65bb22..31f8d6ee70 100644 --- a/release-notes/1.20.13/index.html +++ b/release-notes/1.20.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.13

    General

    diff --git a/release-notes/1.20.14/index.html b/release-notes/1.20.14/index.html index 018f23fe61..339638589e 100644 --- a/release-notes/1.20.14/index.html +++ b/release-notes/1.20.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.14

    General

    diff --git a/release-notes/1.20.15/index.html b/release-notes/1.20.15/index.html index 94bb83b048..e4dfcc9334 100644 --- a/release-notes/1.20.15/index.html +++ b/release-notes/1.20.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.15

    General

    diff --git a/release-notes/1.20.16/index.html b/release-notes/1.20.16/index.html index aa48bf590c..a52e095af5 100644 --- a/release-notes/1.20.16/index.html +++ b/release-notes/1.20.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.16

    General

    diff --git a/release-notes/1.20.2/index.html b/release-notes/1.20.2/index.html index 3f1eaf1389..63f5aabbfc 100644 --- a/release-notes/1.20.2/index.html +++ b/release-notes/1.20.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.2

    General

    diff --git a/release-notes/1.20.3/index.html b/release-notes/1.20.3/index.html index 81eaaab4d6..933fbb4bf0 100644 --- a/release-notes/1.20.3/index.html +++ b/release-notes/1.20.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3

    General

    diff --git a/release-notes/1.20.3rc1/index.html b/release-notes/1.20.3rc1/index.html index 8fc966895d..32f3914ced 100644 --- a/release-notes/1.20.3rc1/index.html +++ b/release-notes/1.20.3rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3rc1

    General

    diff --git a/release-notes/1.20.3rc2/index.html b/release-notes/1.20.3rc2/index.html index ed252ac9f6..6b9f622a5c 100644 --- a/release-notes/1.20.3rc2/index.html +++ b/release-notes/1.20.3rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.3rc2

    General

    diff --git a/release-notes/1.20.4.post1/index.html b/release-notes/1.20.4.post1/index.html index 1f1a61ec3d..47c1932317 100644 --- a/release-notes/1.20.4.post1/index.html +++ b/release-notes/1.20.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4.post1

    General

    diff --git a/release-notes/1.20.4.post2/index.html b/release-notes/1.20.4.post2/index.html index 8f35d721cc..985490b64e 100644 --- a/release-notes/1.20.4.post2/index.html +++ b/release-notes/1.20.4.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4.post2

    General

    diff --git a/release-notes/1.20.4/index.html b/release-notes/1.20.4/index.html index 8e35334ac8..92b2411f94 100644 --- a/release-notes/1.20.4/index.html +++ b/release-notes/1.20.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4

    General

    diff --git a/release-notes/1.20.4rc1/index.html b/release-notes/1.20.4rc1/index.html index 71ced88a7f..4b7177c3b6 100644 --- a/release-notes/1.20.4rc1/index.html +++ b/release-notes/1.20.4rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc1

    General

    diff --git a/release-notes/1.20.4rc2/index.html b/release-notes/1.20.4rc2/index.html index 1c30f84ad0..f5a2f896b0 100644 --- a/release-notes/1.20.4rc2/index.html +++ b/release-notes/1.20.4rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc2

    General

    diff --git a/release-notes/1.20.4rc3/index.html b/release-notes/1.20.4rc3/index.html index 1fce6f80c9..cf08e6d6d6 100644 --- a/release-notes/1.20.4rc3/index.html +++ b/release-notes/1.20.4rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.4rc3

    General

    diff --git a/release-notes/1.20.5/index.html b/release-notes/1.20.5/index.html index 327bfe3ed5..59a9b1d277 100644 --- a/release-notes/1.20.5/index.html +++ b/release-notes/1.20.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.5

    General

    diff --git a/release-notes/1.20.6/index.html b/release-notes/1.20.6/index.html index d0d5bab558..02b579df5f 100644 --- a/release-notes/1.20.6/index.html +++ b/release-notes/1.20.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.6

    General

    diff --git a/release-notes/1.20.7/index.html b/release-notes/1.20.7/index.html index 1c3ab013c3..d4c1d115e9 100644 --- a/release-notes/1.20.7/index.html +++ b/release-notes/1.20.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.7

    General

    diff --git a/release-notes/1.20.8/index.html b/release-notes/1.20.8/index.html index 7708c28977..416f105b85 100644 --- a/release-notes/1.20.8/index.html +++ b/release-notes/1.20.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.8

    General

    diff --git a/release-notes/1.20.9/index.html b/release-notes/1.20.9/index.html index 0689da5306..2541c7af97 100644 --- a/release-notes/1.20.9/index.html +++ b/release-notes/1.20.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.20.9

    General

    diff --git a/release-notes/1.21.0.post1/index.html b/release-notes/1.21.0.post1/index.html index f7c8c94d85..f17e9af0fc 100644 --- a/release-notes/1.21.0.post1/index.html +++ b/release-notes/1.21.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0.post1

    Clients

    diff --git a/release-notes/1.21.0.post2/index.html b/release-notes/1.21.0.post2/index.html index b2d12c45f1..56f6af8911 100644 --- a/release-notes/1.21.0.post2/index.html +++ b/release-notes/1.21.0.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0.post2

    General

    diff --git a/release-notes/1.21.0/index.html b/release-notes/1.21.0/index.html index 3e4b57dc60..51a701a18b 100644 --- a/release-notes/1.21.0/index.html +++ b/release-notes/1.21.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0

    Upgrade Instructions

    diff --git a/release-notes/1.21.0rc1/index.html b/release-notes/1.21.0rc1/index.html index 1d50d9be11..9b1abc0c70 100644 --- a/release-notes/1.21.0rc1/index.html +++ b/release-notes/1.21.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc1

    Release candidate

    diff --git a/release-notes/1.21.0rc2/index.html b/release-notes/1.21.0rc2/index.html index 2d95e23c54..01ac735ff6 100644 --- a/release-notes/1.21.0rc2/index.html +++ b/release-notes/1.21.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc2

    Release candidate

    diff --git a/release-notes/1.21.0rc3/index.html b/release-notes/1.21.0rc3/index.html index 951385a2c3..150694b89b 100644 --- a/release-notes/1.21.0rc3/index.html +++ b/release-notes/1.21.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.0rc3

    Release candidate

    diff --git a/release-notes/1.21.1/index.html b/release-notes/1.21.1/index.html index c476959144..564ca8bae6 100644 --- a/release-notes/1.21.1/index.html +++ b/release-notes/1.21.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.1

    General

    diff --git a/release-notes/1.21.10.post1/index.html b/release-notes/1.21.10.post1/index.html index 31df4a0353..e69b2b053e 100644 --- a/release-notes/1.21.10.post1/index.html +++ b/release-notes/1.21.10.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.10.post1

    General

    diff --git a/release-notes/1.21.10/index.html b/release-notes/1.21.10/index.html index df3287a96e..d773505db1 100644 --- a/release-notes/1.21.10/index.html +++ b/release-notes/1.21.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.10

    General

    diff --git a/release-notes/1.21.11/index.html b/release-notes/1.21.11/index.html index b969415a74..3e6c67575d 100644 --- a/release-notes/1.21.11/index.html +++ b/release-notes/1.21.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.11

    Clients

    diff --git a/release-notes/1.21.12/index.html b/release-notes/1.21.12/index.html index 0dd5811dd6..4fdbe0273f 100644 --- a/release-notes/1.21.12/index.html +++ b/release-notes/1.21.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.12

    General

    diff --git a/release-notes/1.21.2/index.html b/release-notes/1.21.2/index.html index 01623eceb7..8458adcea2 100644 --- a/release-notes/1.21.2/index.html +++ b/release-notes/1.21.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.2

    General

    diff --git a/release-notes/1.21.3/index.html b/release-notes/1.21.3/index.html index 066253c71c..b0fc5335cd 100644 --- a/release-notes/1.21.3/index.html +++ b/release-notes/1.21.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.3

    General

    diff --git a/release-notes/1.21.4/index.html b/release-notes/1.21.4/index.html index f15fc01eb5..6c9e57fb06 100644 --- a/release-notes/1.21.4/index.html +++ b/release-notes/1.21.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.4

    General

    diff --git a/release-notes/1.21.5/index.html b/release-notes/1.21.5/index.html index ba64e416e7..c145845196 100644 --- a/release-notes/1.21.5/index.html +++ b/release-notes/1.21.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.5

    General

    diff --git a/release-notes/1.21.6/index.html b/release-notes/1.21.6/index.html index 22186e2b3e..39dfe1321f 100644 --- a/release-notes/1.21.6/index.html +++ b/release-notes/1.21.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.6

    General

    diff --git a/release-notes/1.21.7/index.html b/release-notes/1.21.7/index.html index d258e2a8d4..510484cccb 100644 --- a/release-notes/1.21.7/index.html +++ b/release-notes/1.21.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.7

    General

    diff --git a/release-notes/1.21.8/index.html b/release-notes/1.21.8/index.html index 12e35324a9..269b3d9d11 100644 --- a/release-notes/1.21.8/index.html +++ b/release-notes/1.21.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.8

    General

    diff --git a/release-notes/1.21.9/index.html b/release-notes/1.21.9/index.html index 577b16a101..5d2b0a97f0 100644 --- a/release-notes/1.21.9/index.html +++ b/release-notes/1.21.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.21.9

    Clients

    diff --git a/release-notes/1.22.0.dev2/index.html b/release-notes/1.22.0.dev2/index.html index a08199da15..8fe06f5ae2 100644 --- a/release-notes/1.22.0.dev2/index.html +++ b/release-notes/1.22.0.dev2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0.dev2

    General

    diff --git a/release-notes/1.22.0.dev3/index.html b/release-notes/1.22.0.dev3/index.html index e73b4a2dcf..0f9c61e56b 100644 --- a/release-notes/1.22.0.dev3/index.html +++ b/release-notes/1.22.0.dev3/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0.dev3

    General

    diff --git a/release-notes/1.22.0/index.html b/release-notes/1.22.0/index.html index 6b17fd0523..23c9b9b65c 100644 --- a/release-notes/1.22.0/index.html +++ b/release-notes/1.22.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0

    Upgrade Instructions

    diff --git a/release-notes/1.22.0rc1/index.html b/release-notes/1.22.0rc1/index.html index 886f491ac4..34de370ce4 100644 --- a/release-notes/1.22.0rc1/index.html +++ b/release-notes/1.22.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0rc1

    Release Candidate

    diff --git a/release-notes/1.22.0rc2/index.html b/release-notes/1.22.0rc2/index.html index 3b671cfcdd..9c2a405b66 100644 --- a/release-notes/1.22.0rc2/index.html +++ b/release-notes/1.22.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.0rc2

    Release Candidate

    diff --git a/release-notes/1.22.1/index.html b/release-notes/1.22.1/index.html index df51e32d4e..812a7c25a7 100644 --- a/release-notes/1.22.1/index.html +++ b/release-notes/1.22.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.1

    General

    diff --git a/release-notes/1.22.2/index.html b/release-notes/1.22.2/index.html index 0ca9364d17..e25e2cc03d 100644 --- a/release-notes/1.22.2/index.html +++ b/release-notes/1.22.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.2

    General

    diff --git a/release-notes/1.22.3.post1/index.html b/release-notes/1.22.3.post1/index.html index 9745d8b188..41f4a1f9b0 100644 --- a/release-notes/1.22.3.post1/index.html +++ b/release-notes/1.22.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.3.post1

    General

    diff --git a/release-notes/1.22.3/index.html b/release-notes/1.22.3/index.html index 67589a1f61..50f5d9cc80 100644 --- a/release-notes/1.22.3/index.html +++ b/release-notes/1.22.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.3

    General

    diff --git a/release-notes/1.22.4.dev1/index.html b/release-notes/1.22.4.dev1/index.html index 72008a8aa7..565a5fc691 100644 --- a/release-notes/1.22.4.dev1/index.html +++ b/release-notes/1.22.4.dev1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.4.dev1

    General

    diff --git a/release-notes/1.22.4/index.html b/release-notes/1.22.4/index.html index 831f3d18ec..b3e5195693 100644 --- a/release-notes/1.22.4/index.html +++ b/release-notes/1.22.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.4

    General

    diff --git a/release-notes/1.22.5/index.html b/release-notes/1.22.5/index.html index 604e6fd96f..3294a83190 100644 --- a/release-notes/1.22.5/index.html +++ b/release-notes/1.22.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.5

    Clients

    diff --git a/release-notes/1.22.6.post1/index.html b/release-notes/1.22.6.post1/index.html index 176669f0da..11cebd1eec 100644 --- a/release-notes/1.22.6.post1/index.html +++ b/release-notes/1.22.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.6.post1

    General

    diff --git a/release-notes/1.22.6/index.html b/release-notes/1.22.6/index.html index c9e3aa8aaf..5258908c6f 100644 --- a/release-notes/1.22.6/index.html +++ b/release-notes/1.22.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.6

    General

    diff --git a/release-notes/1.22.7/index.html b/release-notes/1.22.7/index.html index b07c79a3ca..8a0f9e0002 100644 --- a/release-notes/1.22.7/index.html +++ b/release-notes/1.22.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.7

    General

    diff --git a/release-notes/1.22.8.post1/index.html b/release-notes/1.22.8.post1/index.html index 8f7be706ea..3bc4efe015 100644 --- a/release-notes/1.22.8.post1/index.html +++ b/release-notes/1.22.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.8.post1

    General

    diff --git a/release-notes/1.22.8/index.html b/release-notes/1.22.8/index.html index c384f7f5fd..bb6af00c4e 100644 --- a/release-notes/1.22.8/index.html +++ b/release-notes/1.22.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.22.8

    General

    diff --git a/release-notes/1.23.0/index.html b/release-notes/1.23.0/index.html index 906817ffa1..ad888b9ec5 100644 --- a/release-notes/1.23.0/index.html +++ b/release-notes/1.23.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.23.0rc1/index.html b/release-notes/1.23.0rc1/index.html index 50ce9a9025..219e34282c 100644 --- a/release-notes/1.23.0rc1/index.html +++ b/release-notes/1.23.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0rc1

    Release Candidate

    diff --git a/release-notes/1.23.0rc2/index.html b/release-notes/1.23.0rc2/index.html index 9cbf39b332..79020467fb 100644 --- a/release-notes/1.23.0rc2/index.html +++ b/release-notes/1.23.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.0rc2

    Release Candidate

    diff --git a/release-notes/1.23.1/index.html b/release-notes/1.23.1/index.html index 0fa1b75d17..850b9b0a4b 100644 --- a/release-notes/1.23.1/index.html +++ b/release-notes/1.23.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.1

    General

    diff --git a/release-notes/1.23.10/index.html b/release-notes/1.23.10/index.html index d5cb242a03..0d1bcce524 100644 --- a/release-notes/1.23.10/index.html +++ b/release-notes/1.23.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.10

    General

    diff --git a/release-notes/1.23.11.post1/index.html b/release-notes/1.23.11.post1/index.html index 49e1241ce5..c736c8b4da 100644 --- a/release-notes/1.23.11.post1/index.html +++ b/release-notes/1.23.11.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post1

    General

    diff --git a/release-notes/1.23.11.post2/index.html b/release-notes/1.23.11.post2/index.html index c5c6900640..12145b9cab 100644 --- a/release-notes/1.23.11.post2/index.html +++ b/release-notes/1.23.11.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post2

    General

    diff --git a/release-notes/1.23.11.post3/index.html b/release-notes/1.23.11.post3/index.html index aa0cef8089..991da3c17c 100644 --- a/release-notes/1.23.11.post3/index.html +++ b/release-notes/1.23.11.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post3

    General

    diff --git a/release-notes/1.23.11.post4/index.html b/release-notes/1.23.11.post4/index.html index 4c47dac979..5ad6facabd 100644 --- a/release-notes/1.23.11.post4/index.html +++ b/release-notes/1.23.11.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11.post4

    Bugs

    diff --git a/release-notes/1.23.11/index.html b/release-notes/1.23.11/index.html index 184bff29de..0346088ad9 100644 --- a/release-notes/1.23.11/index.html +++ b/release-notes/1.23.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.11

    General

    diff --git a/release-notes/1.23.12/index.html b/release-notes/1.23.12/index.html index e0bd2f17f2..ba75e9d27e 100644 --- a/release-notes/1.23.12/index.html +++ b/release-notes/1.23.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.12

    General

    diff --git a/release-notes/1.23.13/index.html b/release-notes/1.23.13/index.html index 926c5b69e4..c1c55e951e 100644 --- a/release-notes/1.23.13/index.html +++ b/release-notes/1.23.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.13

    General

    diff --git a/release-notes/1.23.14/index.html b/release-notes/1.23.14/index.html index d9ae701223..e557ec0702 100644 --- a/release-notes/1.23.14/index.html +++ b/release-notes/1.23.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.14

    General

    diff --git a/release-notes/1.23.15/index.html b/release-notes/1.23.15/index.html index 17da4f957a..568de3e4de 100644 --- a/release-notes/1.23.15/index.html +++ b/release-notes/1.23.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.15

    General

    diff --git a/release-notes/1.23.16/index.html b/release-notes/1.23.16/index.html index 2629d9ff32..f87af6fb0f 100644 --- a/release-notes/1.23.16/index.html +++ b/release-notes/1.23.16/index.html @@ -9,8 +9,8 @@ - - + +
    diff --git a/release-notes/1.23.17/index.html b/release-notes/1.23.17/index.html index 1440342c63..86d833fc1e 100644 --- a/release-notes/1.23.17/index.html +++ b/release-notes/1.23.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.17

    General

    diff --git a/release-notes/1.23.18/index.html b/release-notes/1.23.18/index.html index a9cb7a30ea..b87afabf8b 100644 --- a/release-notes/1.23.18/index.html +++ b/release-notes/1.23.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.23.17 release.

    diff --git a/release-notes/1.23.19/index.html b/release-notes/1.23.19/index.html index 65aa74f011..1c2c7a524b 100644 --- a/release-notes/1.23.19/index.html +++ b/release-notes/1.23.19/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.19

    General

    diff --git a/release-notes/1.23.2.post1/index.html b/release-notes/1.23.2.post1/index.html index 3d38e48759..3bcbaf380e 100644 --- a/release-notes/1.23.2.post1/index.html +++ b/release-notes/1.23.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2.post1

    General

    diff --git a/release-notes/1.23.2.post2/index.html b/release-notes/1.23.2.post2/index.html index 317c16ee3c..7ba8b93bcc 100644 --- a/release-notes/1.23.2.post2/index.html +++ b/release-notes/1.23.2.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2.post2

    General

    diff --git a/release-notes/1.23.2/index.html b/release-notes/1.23.2/index.html index 6f7f152430..7f3be5bacc 100644 --- a/release-notes/1.23.2/index.html +++ b/release-notes/1.23.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.2

    General

    diff --git a/release-notes/1.23.20/index.html b/release-notes/1.23.20/index.html index 51193d0861..d5a767dded 100644 --- a/release-notes/1.23.20/index.html +++ b/release-notes/1.23.20/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.20

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.23.19 release.

    diff --git a/release-notes/1.23.3/index.html b/release-notes/1.23.3/index.html index bd536ca8c3..845b948b8d 100644 --- a/release-notes/1.23.3/index.html +++ b/release-notes/1.23.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.3

    Clients

    diff --git a/release-notes/1.23.4/index.html b/release-notes/1.23.4/index.html index 44cbd95a78..bc5d249c25 100644 --- a/release-notes/1.23.4/index.html +++ b/release-notes/1.23.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.4

    General

    diff --git a/release-notes/1.23.5.post1/index.html b/release-notes/1.23.5.post1/index.html index d363da9c6f..74e69c73b7 100644 --- a/release-notes/1.23.5.post1/index.html +++ b/release-notes/1.23.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.5.post1

    General

    diff --git a/release-notes/1.23.5/index.html b/release-notes/1.23.5/index.html index ac603c2e54..2eb8d874e0 100644 --- a/release-notes/1.23.5/index.html +++ b/release-notes/1.23.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.5

    General

    diff --git a/release-notes/1.23.6.post1/index.html b/release-notes/1.23.6.post1/index.html index 673ab10a1a..b15674cb7b 100644 --- a/release-notes/1.23.6.post1/index.html +++ b/release-notes/1.23.6.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.6.post1

    General

    diff --git a/release-notes/1.23.6/index.html b/release-notes/1.23.6/index.html index 5c40c8eb3c..836e51d1e2 100644 --- a/release-notes/1.23.6/index.html +++ b/release-notes/1.23.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.6

    General

    diff --git a/release-notes/1.23.7.post1/index.html b/release-notes/1.23.7.post1/index.html index 002e5bc98e..7bb2bc3acd 100644 --- a/release-notes/1.23.7.post1/index.html +++ b/release-notes/1.23.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.7.post1

    General

    diff --git a/release-notes/1.23.7/index.html b/release-notes/1.23.7/index.html index a4ffe0e0e6..d5e6a6b633 100644 --- a/release-notes/1.23.7/index.html +++ b/release-notes/1.23.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.7

    General

    diff --git a/release-notes/1.23.8/index.html b/release-notes/1.23.8/index.html index 79f3b60a6b..5a14767f3a 100644 --- a/release-notes/1.23.8/index.html +++ b/release-notes/1.23.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.8

    General

    diff --git a/release-notes/1.23.9.post1/index.html b/release-notes/1.23.9.post1/index.html index efffbc56e9..8d90701b08 100644 --- a/release-notes/1.23.9.post1/index.html +++ b/release-notes/1.23.9.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post1

    General

    diff --git a/release-notes/1.23.9.post2/index.html b/release-notes/1.23.9.post2/index.html index 44fd840c02..bbfb6fda57 100644 --- a/release-notes/1.23.9.post2/index.html +++ b/release-notes/1.23.9.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post2

    General

    diff --git a/release-notes/1.23.9.post3/index.html b/release-notes/1.23.9.post3/index.html index 5e4b857e8f..68552c882e 100644 --- a/release-notes/1.23.9.post3/index.html +++ b/release-notes/1.23.9.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post3

    General

    diff --git a/release-notes/1.23.9.post4/index.html b/release-notes/1.23.9.post4/index.html index af26139ea7..63679c107c 100644 --- a/release-notes/1.23.9.post4/index.html +++ b/release-notes/1.23.9.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9.post4

    General

    diff --git a/release-notes/1.23.9/index.html b/release-notes/1.23.9/index.html index 895dff2d74..6537f7151c 100644 --- a/release-notes/1.23.9/index.html +++ b/release-notes/1.23.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.23.9

    General

    diff --git a/release-notes/1.24.0/index.html b/release-notes/1.24.0/index.html index cae33278a8..b89f336b78 100644 --- a/release-notes/1.24.0/index.html +++ b/release-notes/1.24.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.0

    Upgrade Instructions

    diff --git a/release-notes/1.24.0rc1/index.html b/release-notes/1.24.0rc1/index.html index 588119de9a..31c5d6f3f8 100644 --- a/release-notes/1.24.0rc1/index.html +++ b/release-notes/1.24.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.0rc1

    Release Candidate

    diff --git a/release-notes/1.24.1.post1/index.html b/release-notes/1.24.1.post1/index.html index 22749bf18e..d262c00689 100644 --- a/release-notes/1.24.1.post1/index.html +++ b/release-notes/1.24.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post1

    General

    diff --git a/release-notes/1.24.1.post2/index.html b/release-notes/1.24.1.post2/index.html index be89055bcc..732d7403c1 100644 --- a/release-notes/1.24.1.post2/index.html +++ b/release-notes/1.24.1.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post2

    General

    diff --git a/release-notes/1.24.1.post3/index.html b/release-notes/1.24.1.post3/index.html index 09b5fa7aa1..03e3e6211e 100644 --- a/release-notes/1.24.1.post3/index.html +++ b/release-notes/1.24.1.post3/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post3

    General

    diff --git a/release-notes/1.24.1.post4/index.html b/release-notes/1.24.1.post4/index.html index 59f0cd42a1..8686507fd9 100644 --- a/release-notes/1.24.1.post4/index.html +++ b/release-notes/1.24.1.post4/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1.post4

    General

    diff --git a/release-notes/1.24.1/index.html b/release-notes/1.24.1/index.html index d482af18f7..1aa9679095 100644 --- a/release-notes/1.24.1/index.html +++ b/release-notes/1.24.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.1

    General

    diff --git a/release-notes/1.24.2.post1/index.html b/release-notes/1.24.2.post1/index.html index 76bb73bce1..d1bf557746 100644 --- a/release-notes/1.24.2.post1/index.html +++ b/release-notes/1.24.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.2.post1

    Important notice

    diff --git a/release-notes/1.24.2/index.html b/release-notes/1.24.2/index.html index c9e6cf03f8..ee5af1eb51 100644 --- a/release-notes/1.24.2/index.html +++ b/release-notes/1.24.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.2

    General

    diff --git a/release-notes/1.24.3.post1/index.html b/release-notes/1.24.3.post1/index.html index 4fa6f76f18..da8be40515 100644 --- a/release-notes/1.24.3.post1/index.html +++ b/release-notes/1.24.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.3.post1

    General

    diff --git a/release-notes/1.24.3/index.html b/release-notes/1.24.3/index.html index 4707efa8ca..a4c908bb83 100644 --- a/release-notes/1.24.3/index.html +++ b/release-notes/1.24.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.3

    General

    diff --git a/release-notes/1.24.4/index.html b/release-notes/1.24.4/index.html index ba33a5e47e..c9c12dbafd 100644 --- a/release-notes/1.24.4/index.html +++ b/release-notes/1.24.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.4

    General

    diff --git a/release-notes/1.24.5.post1/index.html b/release-notes/1.24.5.post1/index.html index ba7790af54..a32d058c7c 100644 --- a/release-notes/1.24.5.post1/index.html +++ b/release-notes/1.24.5.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.5.post1

    General

    diff --git a/release-notes/1.24.5/index.html b/release-notes/1.24.5/index.html index fd1c2e2fda..3b08635a64 100644 --- a/release-notes/1.24.5/index.html +++ b/release-notes/1.24.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.24.5

    General

    diff --git a/release-notes/1.25.0/index.html b/release-notes/1.25.0/index.html index ae5a8a3a21..cd97aea061 100644 --- a/release-notes/1.25.0/index.html +++ b/release-notes/1.25.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0

    Upgrade Instructions

    diff --git a/release-notes/1.25.0rc1/index.html b/release-notes/1.25.0rc1/index.html index 13f0f81043..f12c050a5a 100644 --- a/release-notes/1.25.0rc1/index.html +++ b/release-notes/1.25.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0rc1

    Release Candidate

    diff --git a/release-notes/1.25.0rc2/index.html b/release-notes/1.25.0rc2/index.html index 30c1ceb1a5..2a6f43f182 100644 --- a/release-notes/1.25.0rc2/index.html +++ b/release-notes/1.25.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.0rc2

    Release Candidate

    diff --git a/release-notes/1.25.1.post1/index.html b/release-notes/1.25.1.post1/index.html index 28f449de0f..6e04204f24 100644 --- a/release-notes/1.25.1.post1/index.html +++ b/release-notes/1.25.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1.post1

    General

    diff --git a/release-notes/1.25.1.post2/index.html b/release-notes/1.25.1.post2/index.html index 62f77d208f..89239d1147 100644 --- a/release-notes/1.25.1.post2/index.html +++ b/release-notes/1.25.1.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1.post2

    Clients

    diff --git a/release-notes/1.25.1/index.html b/release-notes/1.25.1/index.html index abc7d0e6ea..60fd102ecf 100644 --- a/release-notes/1.25.1/index.html +++ b/release-notes/1.25.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.1

    General

    diff --git a/release-notes/1.25.2/index.html b/release-notes/1.25.2/index.html index 5e1158e157..ddd04f0682 100644 --- a/release-notes/1.25.2/index.html +++ b/release-notes/1.25.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.2

    General

    diff --git a/release-notes/1.25.3.post1/index.html b/release-notes/1.25.3.post1/index.html index b27ae5f564..5447a3c19f 100644 --- a/release-notes/1.25.3.post1/index.html +++ b/release-notes/1.25.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3.post1

    General

    diff --git a/release-notes/1.25.3.post2/index.html b/release-notes/1.25.3.post2/index.html index 955cf072e2..c4ff9785da 100644 --- a/release-notes/1.25.3.post2/index.html +++ b/release-notes/1.25.3.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3.post2

    General

    diff --git a/release-notes/1.25.3/index.html b/release-notes/1.25.3/index.html index 345498d31b..a9d5477c52 100644 --- a/release-notes/1.25.3/index.html +++ b/release-notes/1.25.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.3

    General

    diff --git a/release-notes/1.25.4.post1/index.html b/release-notes/1.25.4.post1/index.html index 1c446b93fd..e96e1b788e 100644 --- a/release-notes/1.25.4.post1/index.html +++ b/release-notes/1.25.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.4.post1

    General

    diff --git a/release-notes/1.25.4/index.html b/release-notes/1.25.4/index.html index e12247e6e5..27277c0c1c 100644 --- a/release-notes/1.25.4/index.html +++ b/release-notes/1.25.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.4

    General

    diff --git a/release-notes/1.25.5/index.html b/release-notes/1.25.5/index.html index dbe2738ad5..71f9e4698b 100644 --- a/release-notes/1.25.5/index.html +++ b/release-notes/1.25.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.5

    General

    diff --git a/release-notes/1.25.6/index.html b/release-notes/1.25.6/index.html index 836a48ed2d..34942bf552 100644 --- a/release-notes/1.25.6/index.html +++ b/release-notes/1.25.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.6

    General

    diff --git a/release-notes/1.25.7/index.html b/release-notes/1.25.7/index.html index 5fc6f3aa05..238d19498a 100644 --- a/release-notes/1.25.7/index.html +++ b/release-notes/1.25.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.25.7

    General

    diff --git a/release-notes/1.26.0/index.html b/release-notes/1.26.0/index.html index 96b240f077..de0085cc03 100644 --- a/release-notes/1.26.0/index.html +++ b/release-notes/1.26.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.26.0rc1/index.html b/release-notes/1.26.0rc1/index.html index bc4f3c40d1..cd6241a2ac 100644 --- a/release-notes/1.26.0rc1/index.html +++ b/release-notes/1.26.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0rc1

    Release Candidate

    diff --git a/release-notes/1.26.0rc2/index.html b/release-notes/1.26.0rc2/index.html index a9ae572956..fb1453569c 100644 --- a/release-notes/1.26.0rc2/index.html +++ b/release-notes/1.26.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.0rc2

    Release Candidate

    diff --git a/release-notes/1.26.1.post1/index.html b/release-notes/1.26.1.post1/index.html index 821c7c2997..8fc21fa762 100644 --- a/release-notes/1.26.1.post1/index.html +++ b/release-notes/1.26.1.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.1.post1

    Bugs

    diff --git a/release-notes/1.26.1/index.html b/release-notes/1.26.1/index.html index 89c673272f..5f7c0c35bd 100644 --- a/release-notes/1.26.1/index.html +++ b/release-notes/1.26.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.1

    General

    diff --git a/release-notes/1.26.10/index.html b/release-notes/1.26.10/index.html index 072a87fbdc..9f27f36c9b 100644 --- a/release-notes/1.26.10/index.html +++ b/release-notes/1.26.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.10

    General

    diff --git a/release-notes/1.26.11/index.html b/release-notes/1.26.11/index.html index bcbcb9a12c..4dbe9c2e9a 100644 --- a/release-notes/1.26.11/index.html +++ b/release-notes/1.26.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.11

    Clients

    diff --git a/release-notes/1.26.12/index.html b/release-notes/1.26.12/index.html index 0a78bb7ee7..8a23c65afb 100644 --- a/release-notes/1.26.12/index.html +++ b/release-notes/1.26.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.12

    General

    diff --git a/release-notes/1.26.13/index.html b/release-notes/1.26.13/index.html index 6e107af04c..05218b7573 100644 --- a/release-notes/1.26.13/index.html +++ b/release-notes/1.26.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.13

    General

    diff --git a/release-notes/1.26.14/index.html b/release-notes/1.26.14/index.html index 6ddea4b94f..0eaaff4cfc 100644 --- a/release-notes/1.26.14/index.html +++ b/release-notes/1.26.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.14

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.13 release.

    diff --git a/release-notes/1.26.15/index.html b/release-notes/1.26.15/index.html index a6425323ea..72725f1ac7 100644 --- a/release-notes/1.26.15/index.html +++ b/release-notes/1.26.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.15

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.14 release.

    diff --git a/release-notes/1.26.16/index.html b/release-notes/1.26.16/index.html index c59efc93fa..5ca3f5876b 100644 --- a/release-notes/1.26.16/index.html +++ b/release-notes/1.26.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.16

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.15 release.

    diff --git a/release-notes/1.26.17/index.html b/release-notes/1.26.17/index.html index 4fc9ac409b..d2350c3d8e 100644 --- a/release-notes/1.26.17/index.html +++ b/release-notes/1.26.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.17

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.13 release.

    diff --git a/release-notes/1.26.18/index.html b/release-notes/1.26.18/index.html index 615c9224f5..be4d7b3543 100644 --- a/release-notes/1.26.18/index.html +++ b/release-notes/1.26.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.26.17 release.

    diff --git a/release-notes/1.26.2/index.html b/release-notes/1.26.2/index.html index 7f75efeae5..71c73b1dd8 100644 --- a/release-notes/1.26.2/index.html +++ b/release-notes/1.26.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.2

    General

    diff --git a/release-notes/1.26.3/index.html b/release-notes/1.26.3/index.html index 8c7f9913d7..fc968b08e6 100644 --- a/release-notes/1.26.3/index.html +++ b/release-notes/1.26.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.3

    Clients

    diff --git a/release-notes/1.26.4/index.html b/release-notes/1.26.4/index.html index c3c04b68ec..a5441ca521 100644 --- a/release-notes/1.26.4/index.html +++ b/release-notes/1.26.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.4

    General

    diff --git a/release-notes/1.26.5/index.html b/release-notes/1.26.5/index.html index 2a97affd1b..baa3306a14 100644 --- a/release-notes/1.26.5/index.html +++ b/release-notes/1.26.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.5

    General

    diff --git a/release-notes/1.26.6/index.html b/release-notes/1.26.6/index.html index cdc362e790..db68c5db49 100644 --- a/release-notes/1.26.6/index.html +++ b/release-notes/1.26.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.6

    General

    diff --git a/release-notes/1.26.7.post1/index.html b/release-notes/1.26.7.post1/index.html index a6d517d38f..440795c6d2 100644 --- a/release-notes/1.26.7.post1/index.html +++ b/release-notes/1.26.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.7.post1

    General

    diff --git a/release-notes/1.26.7/index.html b/release-notes/1.26.7/index.html index 1ea646fe06..1fdeefd6ab 100644 --- a/release-notes/1.26.7/index.html +++ b/release-notes/1.26.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.7

    Bugs

    diff --git a/release-notes/1.26.8.post1/index.html b/release-notes/1.26.8.post1/index.html index 107738105d..a865854934 100644 --- a/release-notes/1.26.8.post1/index.html +++ b/release-notes/1.26.8.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.8.post1

    General

    diff --git a/release-notes/1.26.8/index.html b/release-notes/1.26.8/index.html index 28f15a9692..2440fc9353 100644 --- a/release-notes/1.26.8/index.html +++ b/release-notes/1.26.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.8

    General

    diff --git a/release-notes/1.26.9/index.html b/release-notes/1.26.9/index.html index 725bf37849..0e478b94ae 100644 --- a/release-notes/1.26.9/index.html +++ b/release-notes/1.26.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.26.9

    General

    diff --git a/release-notes/1.27.0.post1/index.html b/release-notes/1.27.0.post1/index.html index a2ea9e8ec0..032bf608df 100644 --- a/release-notes/1.27.0.post1/index.html +++ b/release-notes/1.27.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0.post1

    General

    diff --git a/release-notes/1.27.0/index.html b/release-notes/1.27.0/index.html index e42915d14a..094f3b3210 100644 --- a/release-notes/1.27.0/index.html +++ b/release-notes/1.27.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0

    Upgrade Instructions

    diff --git a/release-notes/1.27.0rc1/index.html b/release-notes/1.27.0rc1/index.html index b88405a7b8..60fedf2697 100644 --- a/release-notes/1.27.0rc1/index.html +++ b/release-notes/1.27.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0rc1

    Release Candidate

    diff --git a/release-notes/1.27.0rc2/index.html b/release-notes/1.27.0rc2/index.html index 27e3ce00f9..b0d1dabd64 100644 --- a/release-notes/1.27.0rc2/index.html +++ b/release-notes/1.27.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.0rc2

    Release Candidate

    diff --git a/release-notes/1.27.1/index.html b/release-notes/1.27.1/index.html index fce375c46d..985460068a 100644 --- a/release-notes/1.27.1/index.html +++ b/release-notes/1.27.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.1

    General

    diff --git a/release-notes/1.27.10/index.html b/release-notes/1.27.10/index.html index c54c5a1bf7..d5a15b3c04 100644 --- a/release-notes/1.27.10/index.html +++ b/release-notes/1.27.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.10

    General

    diff --git a/release-notes/1.27.11/index.html b/release-notes/1.27.11/index.html index f652d622d0..cdcb91148c 100644 --- a/release-notes/1.27.11/index.html +++ b/release-notes/1.27.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.11

    General

    diff --git a/release-notes/1.27.12/index.html b/release-notes/1.27.12/index.html index 9d199ee616..baef415b6b 100644 --- a/release-notes/1.27.12/index.html +++ b/release-notes/1.27.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.12

    General

    diff --git a/release-notes/1.27.2/index.html b/release-notes/1.27.2/index.html index 88d1af5a2b..b56e86b50b 100644 --- a/release-notes/1.27.2/index.html +++ b/release-notes/1.27.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.2

    General

    diff --git a/release-notes/1.27.3/index.html b/release-notes/1.27.3/index.html index ebf4129240..929a320cf8 100644 --- a/release-notes/1.27.3/index.html +++ b/release-notes/1.27.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.3

    General

    diff --git a/release-notes/1.27.4.post1/index.html b/release-notes/1.27.4.post1/index.html index 91d4c5a216..5e1dbf2d54 100644 --- a/release-notes/1.27.4.post1/index.html +++ b/release-notes/1.27.4.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.4.post1

    General

    diff --git a/release-notes/1.27.4/index.html b/release-notes/1.27.4/index.html index 862517d2c9..8188ed2217 100644 --- a/release-notes/1.27.4/index.html +++ b/release-notes/1.27.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.4

    General

    diff --git a/release-notes/1.27.5/index.html b/release-notes/1.27.5/index.html index f7bae4d126..44165a2d56 100644 --- a/release-notes/1.27.5/index.html +++ b/release-notes/1.27.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.5

    General

    diff --git a/release-notes/1.27.6/index.html b/release-notes/1.27.6/index.html index d17bcb8d5c..1b7bffe252 100644 --- a/release-notes/1.27.6/index.html +++ b/release-notes/1.27.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.6

    Clients

    diff --git a/release-notes/1.27.7/index.html b/release-notes/1.27.7/index.html index 326b883dea..31ce0e3459 100644 --- a/release-notes/1.27.7/index.html +++ b/release-notes/1.27.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.7

    General

    diff --git a/release-notes/1.27.8/index.html b/release-notes/1.27.8/index.html index 615819ea1b..3104195e49 100644 --- a/release-notes/1.27.8/index.html +++ b/release-notes/1.27.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.8

    Clients

    diff --git a/release-notes/1.27.9/index.html b/release-notes/1.27.9/index.html index 6b65477b55..3120d40196 100644 --- a/release-notes/1.27.9/index.html +++ b/release-notes/1.27.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.27.9

    General

    diff --git a/release-notes/1.28.0/index.html b/release-notes/1.28.0/index.html index 56a961df8f..0c50f53d7b 100644 --- a/release-notes/1.28.0/index.html +++ b/release-notes/1.28.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0

    Upgrade Instructions

    diff --git a/release-notes/1.28.0rc1/index.html b/release-notes/1.28.0rc1/index.html index 2c02ba3cba..9911069f4f 100644 --- a/release-notes/1.28.0rc1/index.html +++ b/release-notes/1.28.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0rc1

    Release Candidate

    diff --git a/release-notes/1.28.0rc2/index.html b/release-notes/1.28.0rc2/index.html index 6b41836369..804edcf460 100644 --- a/release-notes/1.28.0rc2/index.html +++ b/release-notes/1.28.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.0rc2

    Release Candidate

    diff --git a/release-notes/1.28.1/index.html b/release-notes/1.28.1/index.html index 7be322c119..137ef723e2 100644 --- a/release-notes/1.28.1/index.html +++ b/release-notes/1.28.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.1

    General

    diff --git a/release-notes/1.28.2/index.html b/release-notes/1.28.2/index.html index 6ef7193ede..634120a273 100644 --- a/release-notes/1.28.2/index.html +++ b/release-notes/1.28.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.2

    General

    diff --git a/release-notes/1.28.3/index.html b/release-notes/1.28.3/index.html index 7627e21a0d..0ea571c638 100644 --- a/release-notes/1.28.3/index.html +++ b/release-notes/1.28.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.3

    General

    diff --git a/release-notes/1.28.4/index.html b/release-notes/1.28.4/index.html index ede9e04eb2..214b3503ed 100644 --- a/release-notes/1.28.4/index.html +++ b/release-notes/1.28.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.4

    General

    diff --git a/release-notes/1.28.5/index.html b/release-notes/1.28.5/index.html index 027d7e48bf..915ef2488f 100644 --- a/release-notes/1.28.5/index.html +++ b/release-notes/1.28.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.5

    General

    diff --git a/release-notes/1.28.6/index.html b/release-notes/1.28.6/index.html index 43fcb1d84d..66e3cc08cb 100644 --- a/release-notes/1.28.6/index.html +++ b/release-notes/1.28.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.6

    General

    diff --git a/release-notes/1.28.7/index.html b/release-notes/1.28.7/index.html index 73af41e3f3..bde6f858cd 100644 --- a/release-notes/1.28.7/index.html +++ b/release-notes/1.28.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.28.7

    General

    diff --git a/release-notes/1.29.0/index.html b/release-notes/1.29.0/index.html index f52e2da600..8d006bb502 100644 --- a/release-notes/1.29.0/index.html +++ b/release-notes/1.29.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0

    Long Term Support (LTS)

    diff --git a/release-notes/1.29.0rc1/index.html b/release-notes/1.29.0rc1/index.html index 8523e1fa8f..cfc7fdad49 100644 --- a/release-notes/1.29.0rc1/index.html +++ b/release-notes/1.29.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0rc1

    Release Candidate

    diff --git a/release-notes/1.29.0rc2/index.html b/release-notes/1.29.0rc2/index.html index 595b597266..84d701d777 100644 --- a/release-notes/1.29.0rc2/index.html +++ b/release-notes/1.29.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.0rc2

    Release Candidate

    diff --git a/release-notes/1.29.1/index.html b/release-notes/1.29.1/index.html index a5a42d0c9c..bef24ccc37 100644 --- a/release-notes/1.29.1/index.html +++ b/release-notes/1.29.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.1

    General

    diff --git a/release-notes/1.29.10/index.html b/release-notes/1.29.10/index.html index 13abd3c399..8c7d1b3806 100644 --- a/release-notes/1.29.10/index.html +++ b/release-notes/1.29.10/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.10

    General

    diff --git a/release-notes/1.29.11/index.html b/release-notes/1.29.11/index.html index 56bc18d126..9f432260cb 100644 --- a/release-notes/1.29.11/index.html +++ b/release-notes/1.29.11/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.11

    Clients

    diff --git a/release-notes/1.29.12/index.html b/release-notes/1.29.12/index.html index 7388911655..edeb1a99ab 100644 --- a/release-notes/1.29.12/index.html +++ b/release-notes/1.29.12/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.12

    WebUI

    diff --git a/release-notes/1.29.13/index.html b/release-notes/1.29.13/index.html index fbf12da61c..6e1d963d78 100644 --- a/release-notes/1.29.13/index.html +++ b/release-notes/1.29.13/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.13

    General

    diff --git a/release-notes/1.29.14/index.html b/release-notes/1.29.14/index.html index 3f89d4b033..bc87b1362d 100644 --- a/release-notes/1.29.14/index.html +++ b/release-notes/1.29.14/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.14

    General

    diff --git a/release-notes/1.29.15/index.html b/release-notes/1.29.15/index.html index 8cfba3d1e4..4ed451cfe5 100644 --- a/release-notes/1.29.15/index.html +++ b/release-notes/1.29.15/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.15

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.14 release.

    diff --git a/release-notes/1.29.16/index.html b/release-notes/1.29.16/index.html index 2990c032e2..6e4b566ea6 100644 --- a/release-notes/1.29.16/index.html +++ b/release-notes/1.29.16/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.16

    General

    diff --git a/release-notes/1.29.17/index.html b/release-notes/1.29.17/index.html index 582e9bd96f..380401e690 100644 --- a/release-notes/1.29.17/index.html +++ b/release-notes/1.29.17/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.17

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.16 release.

    diff --git a/release-notes/1.29.18/index.html b/release-notes/1.29.18/index.html index f608c8ad8f..ab94e63247 100644 --- a/release-notes/1.29.18/index.html +++ b/release-notes/1.29.18/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.18

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.17 release.

    diff --git a/release-notes/1.29.19/index.html b/release-notes/1.29.19/index.html index bfe6d019ba..67187d6ee3 100644 --- a/release-notes/1.29.19/index.html +++ b/release-notes/1.29.19/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.19

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 1.29.18 release.

    diff --git a/release-notes/1.29.2.post1/index.html b/release-notes/1.29.2.post1/index.html index f9fbe2b7cc..fbaf0709d9 100644 --- a/release-notes/1.29.2.post1/index.html +++ b/release-notes/1.29.2.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2.post1

    Clients

    diff --git a/release-notes/1.29.2.post2/index.html b/release-notes/1.29.2.post2/index.html index d4eb60b5f7..f49c61e8a6 100644 --- a/release-notes/1.29.2.post2/index.html +++ b/release-notes/1.29.2.post2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2.post2

    General

    diff --git a/release-notes/1.29.2/index.html b/release-notes/1.29.2/index.html index 17d0052453..58ab38888c 100644 --- a/release-notes/1.29.2/index.html +++ b/release-notes/1.29.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.2

    General

    diff --git a/release-notes/1.29.3.post1/index.html b/release-notes/1.29.3.post1/index.html index 1de0111918..aec85ed954 100644 --- a/release-notes/1.29.3.post1/index.html +++ b/release-notes/1.29.3.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.3.post1

    General

    diff --git a/release-notes/1.29.3/index.html b/release-notes/1.29.3/index.html index 738c24cfbe..b149968e5f 100644 --- a/release-notes/1.29.3/index.html +++ b/release-notes/1.29.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.3

    General

    diff --git a/release-notes/1.29.4/index.html b/release-notes/1.29.4/index.html index 6b2cb0dd94..ce0c77b589 100644 --- a/release-notes/1.29.4/index.html +++ b/release-notes/1.29.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.4

    General

    diff --git a/release-notes/1.29.5/index.html b/release-notes/1.29.5/index.html index 20fe289cd1..400ca0c338 100644 --- a/release-notes/1.29.5/index.html +++ b/release-notes/1.29.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.5

    General

    diff --git a/release-notes/1.29.6/index.html b/release-notes/1.29.6/index.html index 9fa3f899ec..53bf7f24f1 100644 --- a/release-notes/1.29.6/index.html +++ b/release-notes/1.29.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.6

    General

    diff --git a/release-notes/1.29.7.post1/index.html b/release-notes/1.29.7.post1/index.html index 74d02b0888..6e3e66ee2c 100644 --- a/release-notes/1.29.7.post1/index.html +++ b/release-notes/1.29.7.post1/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.7.post1

    General

    diff --git a/release-notes/1.29.7/index.html b/release-notes/1.29.7/index.html index d329a09559..7a316882ef 100644 --- a/release-notes/1.29.7/index.html +++ b/release-notes/1.29.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.7

    General

    diff --git a/release-notes/1.29.8/index.html b/release-notes/1.29.8/index.html index fa1bc849cd..26fe1c21a4 100644 --- a/release-notes/1.29.8/index.html +++ b/release-notes/1.29.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.8

    General

    diff --git a/release-notes/1.29.9/index.html b/release-notes/1.29.9/index.html index 1d55e4e000..8030c37b78 100644 --- a/release-notes/1.29.9/index.html +++ b/release-notes/1.29.9/index.html @@ -9,8 +9,8 @@ - - + +

    1.29.9

    General

    diff --git a/release-notes/1.30.0/index.html b/release-notes/1.30.0/index.html index dbd57dde04..a889ee5845 100644 --- a/release-notes/1.30.0/index.html +++ b/release-notes/1.30.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0

    Upgrade Instructions

    diff --git a/release-notes/1.30.0rc1/index.html b/release-notes/1.30.0rc1/index.html index b80faa86d6..1393e6ef36 100644 --- a/release-notes/1.30.0rc1/index.html +++ b/release-notes/1.30.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc1

    Release Candidate

    diff --git a/release-notes/1.30.0rc2/index.html b/release-notes/1.30.0rc2/index.html index 90bd7cf974..6cb6d1c447 100644 --- a/release-notes/1.30.0rc2/index.html +++ b/release-notes/1.30.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc2

    Release Candidate

    diff --git a/release-notes/1.30.0rc3/index.html b/release-notes/1.30.0rc3/index.html index 4dc0ba205f..6ad54bfda3 100644 --- a/release-notes/1.30.0rc3/index.html +++ b/release-notes/1.30.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.0rc3

    Release Candidate

    diff --git a/release-notes/1.30.1/index.html b/release-notes/1.30.1/index.html index 6d6435c105..9b7521d109 100644 --- a/release-notes/1.30.1/index.html +++ b/release-notes/1.30.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.1

    General

    diff --git a/release-notes/1.30.2/index.html b/release-notes/1.30.2/index.html index 31a426faf3..6cb6e10df5 100644 --- a/release-notes/1.30.2/index.html +++ b/release-notes/1.30.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.2

    General

    diff --git a/release-notes/1.30.3/index.html b/release-notes/1.30.3/index.html index 83e89a359f..05acda6baf 100644 --- a/release-notes/1.30.3/index.html +++ b/release-notes/1.30.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.3

    General

    diff --git a/release-notes/1.30.4/index.html b/release-notes/1.30.4/index.html index 9e6c8b2206..95e90a4ce0 100644 --- a/release-notes/1.30.4/index.html +++ b/release-notes/1.30.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.4

    General

    diff --git a/release-notes/1.30.5/index.html b/release-notes/1.30.5/index.html index 894a9f65f1..5c78f3e195 100644 --- a/release-notes/1.30.5/index.html +++ b/release-notes/1.30.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.5

    General

    diff --git a/release-notes/1.30.6/index.html b/release-notes/1.30.6/index.html index 3c4b2a5ba6..5099556298 100644 --- a/release-notes/1.30.6/index.html +++ b/release-notes/1.30.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.6

    General

    diff --git a/release-notes/1.30.7/index.html b/release-notes/1.30.7/index.html index 0e634f415c..e2d097656b 100644 --- a/release-notes/1.30.7/index.html +++ b/release-notes/1.30.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.7

    General

    diff --git a/release-notes/1.30.8/index.html b/release-notes/1.30.8/index.html index 5ca77f185a..8d48765a2c 100644 --- a/release-notes/1.30.8/index.html +++ b/release-notes/1.30.8/index.html @@ -9,8 +9,8 @@ - - + +

    1.30.8

    General

    diff --git a/release-notes/1.31.0/index.html b/release-notes/1.31.0/index.html index 6e0c702a7f..3b7318d1a0 100644 --- a/release-notes/1.31.0/index.html +++ b/release-notes/1.31.0/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc1/index.html b/release-notes/1.31.0rc1/index.html index fc27b4e61a..b9c549fcba 100644 --- a/release-notes/1.31.0rc1/index.html +++ b/release-notes/1.31.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc1

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc2/index.html b/release-notes/1.31.0rc2/index.html index 959376e9b7..552c31f240 100644 --- a/release-notes/1.31.0rc2/index.html +++ b/release-notes/1.31.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc2

    Upgrade Instructions

    diff --git a/release-notes/1.31.0rc3/index.html b/release-notes/1.31.0rc3/index.html index b31e12fcb1..782feac930 100644 --- a/release-notes/1.31.0rc3/index.html +++ b/release-notes/1.31.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.0rc3

    Upgrade Instructions

    diff --git a/release-notes/1.31.1/index.html b/release-notes/1.31.1/index.html index e5bf204312..9c955c5994 100644 --- a/release-notes/1.31.1/index.html +++ b/release-notes/1.31.1/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.1

    General

    diff --git a/release-notes/1.31.2/index.html b/release-notes/1.31.2/index.html index 594b5f4a7d..eee726afeb 100644 --- a/release-notes/1.31.2/index.html +++ b/release-notes/1.31.2/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.2

    General

    diff --git a/release-notes/1.31.3/index.html b/release-notes/1.31.3/index.html index 13f86a5752..b653c691f2 100644 --- a/release-notes/1.31.3/index.html +++ b/release-notes/1.31.3/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.3

    General

    diff --git a/release-notes/1.31.4/index.html b/release-notes/1.31.4/index.html index afd1da8b38..286ef0eeee 100644 --- a/release-notes/1.31.4/index.html +++ b/release-notes/1.31.4/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.4

    General

    diff --git a/release-notes/1.31.5/index.html b/release-notes/1.31.5/index.html index 78a956ce59..a0f7661e11 100644 --- a/release-notes/1.31.5/index.html +++ b/release-notes/1.31.5/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.5

    General

    diff --git a/release-notes/1.31.6/index.html b/release-notes/1.31.6/index.html index df8c54ec7e..c1db54a747 100644 --- a/release-notes/1.31.6/index.html +++ b/release-notes/1.31.6/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.6

    General

    diff --git a/release-notes/1.31.7/index.html b/release-notes/1.31.7/index.html index 48a5ae647d..ab00316176 100644 --- a/release-notes/1.31.7/index.html +++ b/release-notes/1.31.7/index.html @@ -9,8 +9,8 @@ - - + +

    1.31.7

    General

    diff --git a/release-notes/32.0.0/index.html b/release-notes/32.0.0/index.html index 3df066b459..238fbc6137 100644 --- a/release-notes/32.0.0/index.html +++ b/release-notes/32.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0

    Long Term Support (LTS)

    diff --git a/release-notes/32.0.0rc1/index.html b/release-notes/32.0.0rc1/index.html index a19da36db4..0649633668 100644 --- a/release-notes/32.0.0rc1/index.html +++ b/release-notes/32.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0rc1

    Release Candidate

    diff --git a/release-notes/32.0.0rc2/index.html b/release-notes/32.0.0rc2/index.html index 220ebc7fc6..70274fe01e 100644 --- a/release-notes/32.0.0rc2/index.html +++ b/release-notes/32.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    32.0.0rc2

    Release Candidate

    diff --git a/release-notes/32.1.0/index.html b/release-notes/32.1.0/index.html index f8ecac31df..cc2719e6fb 100644 --- a/release-notes/32.1.0/index.html +++ b/release-notes/32.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.1.0

    General

    diff --git a/release-notes/32.2.0/index.html b/release-notes/32.2.0/index.html index 085482efd4..8cf7821179 100644 --- a/release-notes/32.2.0/index.html +++ b/release-notes/32.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.2.0

    General

    diff --git a/release-notes/32.3.0/index.html b/release-notes/32.3.0/index.html index 0e8272a04b..12c70c1fdd 100644 --- a/release-notes/32.3.0/index.html +++ b/release-notes/32.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.3.0

    General

    diff --git a/release-notes/32.3.1/index.html b/release-notes/32.3.1/index.html index 33d72fd89c..259f29e55d 100644 --- a/release-notes/32.3.1/index.html +++ b/release-notes/32.3.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.3.1

    General

    diff --git a/release-notes/32.4.0/index.html b/release-notes/32.4.0/index.html index 4bb31093a1..a095f0806f 100644 --- a/release-notes/32.4.0/index.html +++ b/release-notes/32.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.4.0

    General

    diff --git a/release-notes/32.5.0.post1/index.html b/release-notes/32.5.0.post1/index.html index df4a767d96..f3ac05341c 100644 --- a/release-notes/32.5.0.post1/index.html +++ b/release-notes/32.5.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.0.post1

    Hotfix release due to rebuild of the containers.

    diff --git a/release-notes/32.5.0/index.html b/release-notes/32.5.0/index.html index a91a3e5a98..7d3c809fef 100644 --- a/release-notes/32.5.0/index.html +++ b/release-notes/32.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.0

    General

    diff --git a/release-notes/32.5.1/index.html b/release-notes/32.5.1/index.html index e1e21a7297..52b2460211 100644 --- a/release-notes/32.5.1/index.html +++ b/release-notes/32.5.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.5.1

    General

    diff --git a/release-notes/32.6.0.post1/index.html b/release-notes/32.6.0.post1/index.html index 7ad7d07117..d2d2f6a188 100644 --- a/release-notes/32.6.0.post1/index.html +++ b/release-notes/32.6.0.post1/index.html @@ -9,8 +9,8 @@ - - + +

    32.6.0.post1

    No functional change, trigger container rebuild for dependency-of-dependency issue

    diff --git a/release-notes/32.6.0/index.html b/release-notes/32.6.0/index.html index d54faab592..43bfcef6e2 100644 --- a/release-notes/32.6.0/index.html +++ b/release-notes/32.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.6.0

    General

    diff --git a/release-notes/32.7.0/index.html b/release-notes/32.7.0/index.html index 27d4972ff6..071001f627 100644 --- a/release-notes/32.7.0/index.html +++ b/release-notes/32.7.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.7.0

    General

    diff --git a/release-notes/32.8.0/index.html b/release-notes/32.8.0/index.html index d4668f1e3f..25b07a0419 100644 --- a/release-notes/32.8.0/index.html +++ b/release-notes/32.8.0/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.0

    General

    diff --git a/release-notes/32.8.1/index.html b/release-notes/32.8.1/index.html index 4c611cb98f..fd1a86c39a 100644 --- a/release-notes/32.8.1/index.html +++ b/release-notes/32.8.1/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.1

    This is a blank LTS release issued to trigger re-building of related container images and dependencies. It is functionally equivalent to the 32.8.0 release.

    diff --git a/release-notes/32.8.2/index.html b/release-notes/32.8.2/index.html index 1b8f10a89f..1ac32b7e26 100644 --- a/release-notes/32.8.2/index.html +++ b/release-notes/32.8.2/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.2

    Clients

    diff --git a/release-notes/32.8.3/index.html b/release-notes/32.8.3/index.html index 390d613d10..f853274203 100644 --- a/release-notes/32.8.3/index.html +++ b/release-notes/32.8.3/index.html @@ -9,8 +9,8 @@ - - + +

    32.8.3

    General

    diff --git a/release-notes/33.0.0/index.html b/release-notes/33.0.0/index.html index e4608f2e3f..ff26b64129 100644 --- a/release-notes/33.0.0/index.html +++ b/release-notes/33.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0

    Upgrade Instructions

    diff --git a/release-notes/33.0.0rc1/index.html b/release-notes/33.0.0rc1/index.html index 35cd2a2974..4f0c00c017 100644 --- a/release-notes/33.0.0rc1/index.html +++ b/release-notes/33.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc1

    Release Candidate

    diff --git a/release-notes/33.0.0rc2/index.html b/release-notes/33.0.0rc2/index.html index 04a7b01fff..ae2a5155ef 100644 --- a/release-notes/33.0.0rc2/index.html +++ b/release-notes/33.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc2

    Release Candidate

    diff --git a/release-notes/33.0.0rc3/index.html b/release-notes/33.0.0rc3/index.html index 985add2b62..40cfb5b063 100644 --- a/release-notes/33.0.0rc3/index.html +++ b/release-notes/33.0.0rc3/index.html @@ -9,8 +9,8 @@ - - + +

    33.0.0rc3

    Release Candidate

    diff --git a/release-notes/33.1.0/index.html b/release-notes/33.1.0/index.html index cd701f33c3..d063497cb3 100644 --- a/release-notes/33.1.0/index.html +++ b/release-notes/33.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.1.0

    General

    diff --git a/release-notes/33.2.0/index.html b/release-notes/33.2.0/index.html index e267f8d4e5..22d5379538 100644 --- a/release-notes/33.2.0/index.html +++ b/release-notes/33.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.2.0

    General

    diff --git a/release-notes/33.2.1/index.html b/release-notes/33.2.1/index.html index ed2b621be7..dabd4c9486 100644 --- a/release-notes/33.2.1/index.html +++ b/release-notes/33.2.1/index.html @@ -9,8 +9,8 @@ - - + +

    33.2.1

    General

    diff --git a/release-notes/33.3.0/index.html b/release-notes/33.3.0/index.html index bf5fe267d4..5681fa1634 100644 --- a/release-notes/33.3.0/index.html +++ b/release-notes/33.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.3.0

    General

    diff --git a/release-notes/33.4.0.post1/index.html b/release-notes/33.4.0.post1/index.html index 69d6841920..248fc832dc 100644 --- a/release-notes/33.4.0.post1/index.html +++ b/release-notes/33.4.0.post1/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/release-notes/33.4.0/index.html b/release-notes/33.4.0/index.html index 159e303186..ded6322225 100644 --- a/release-notes/33.4.0/index.html +++ b/release-notes/33.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.4.0

    General

    diff --git a/release-notes/33.5.0/index.html b/release-notes/33.5.0/index.html index 4a5c795a04..0e8001208a 100644 --- a/release-notes/33.5.0/index.html +++ b/release-notes/33.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.5.0

    General

    diff --git a/release-notes/33.6.0/index.html b/release-notes/33.6.0/index.html index 9f65794cd2..38a6a436c5 100644 --- a/release-notes/33.6.0/index.html +++ b/release-notes/33.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    33.6.0

    General

    diff --git a/release-notes/33.6.1/index.html b/release-notes/33.6.1/index.html index e441324f48..82eba2b231 100644 --- a/release-notes/33.6.1/index.html +++ b/release-notes/33.6.1/index.html @@ -9,8 +9,8 @@ - - + +

    33.6.1

    General

    diff --git a/release-notes/34.0.0/index.html b/release-notes/34.0.0/index.html index 2c53b720ff..56e25a5693 100644 --- a/release-notes/34.0.0/index.html +++ b/release-notes/34.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0

    Upgrade Instructions

    diff --git a/release-notes/34.0.0rc1/index.html b/release-notes/34.0.0rc1/index.html index fe7e132b86..3cb40ca3d5 100644 --- a/release-notes/34.0.0rc1/index.html +++ b/release-notes/34.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0rc1

    Release Candidate

    diff --git a/release-notes/34.0.0rc2/index.html b/release-notes/34.0.0rc2/index.html index ba1861c020..1a61c5b31f 100644 --- a/release-notes/34.0.0rc2/index.html +++ b/release-notes/34.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    34.0.0rc2

    Release Candidate

    diff --git a/release-notes/34.1.0/index.html b/release-notes/34.1.0/index.html index ed9977dbf1..f5504a74cc 100644 --- a/release-notes/34.1.0/index.html +++ b/release-notes/34.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.1.0

    General

    diff --git a/release-notes/34.2.0/index.html b/release-notes/34.2.0/index.html index 613a5c7d50..0265c522de 100644 --- a/release-notes/34.2.0/index.html +++ b/release-notes/34.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.2.0

    General

    diff --git a/release-notes/34.3.0/index.html b/release-notes/34.3.0/index.html index 40769de0f5..12ba37f2d7 100644 --- a/release-notes/34.3.0/index.html +++ b/release-notes/34.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.3.0

    General

    diff --git a/release-notes/34.4.0/index.html b/release-notes/34.4.0/index.html index 7ac1a24650..36ff37d554 100644 --- a/release-notes/34.4.0/index.html +++ b/release-notes/34.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.0

    General

    diff --git a/release-notes/34.4.1/index.html b/release-notes/34.4.1/index.html index 4dbc7863e5..fde3f04da3 100644 --- a/release-notes/34.4.1/index.html +++ b/release-notes/34.4.1/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.1

    General

    diff --git a/release-notes/34.4.2/index.html b/release-notes/34.4.2/index.html index a812e719e1..e9ca1ef44a 100644 --- a/release-notes/34.4.2/index.html +++ b/release-notes/34.4.2/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.2

    General

    diff --git a/release-notes/34.4.3/index.html b/release-notes/34.4.3/index.html index db1308f590..f5becc0f1f 100644 --- a/release-notes/34.4.3/index.html +++ b/release-notes/34.4.3/index.html @@ -9,8 +9,8 @@ - - + +

    34.4.3

    General

    diff --git a/release-notes/34.5.0/index.html b/release-notes/34.5.0/index.html index ab994bc969..7209956014 100644 --- a/release-notes/34.5.0/index.html +++ b/release-notes/34.5.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.5.0

    General

    diff --git a/release-notes/34.6.0/index.html b/release-notes/34.6.0/index.html index 0678700a46..6c37ce1a7c 100644 --- a/release-notes/34.6.0/index.html +++ b/release-notes/34.6.0/index.html @@ -9,8 +9,8 @@ - - + +

    34.6.0

    General

    diff --git a/release-notes/35.0.0/index.html b/release-notes/35.0.0/index.html index 3367a6d60e..c2721b729b 100644 --- a/release-notes/35.0.0/index.html +++ b/release-notes/35.0.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0

    Long Term Support (LTS)

    diff --git a/release-notes/35.0.0rc1/index.html b/release-notes/35.0.0rc1/index.html index b209071847..8b773c82f3 100644 --- a/release-notes/35.0.0rc1/index.html +++ b/release-notes/35.0.0rc1/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0rc1

    Release Candidate

    diff --git a/release-notes/35.0.0rc2/index.html b/release-notes/35.0.0rc2/index.html index 40b0d883e8..e972a0d77a 100644 --- a/release-notes/35.0.0rc2/index.html +++ b/release-notes/35.0.0rc2/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.0rc2

    Release Candidate

    diff --git a/release-notes/35.0.1/index.html b/release-notes/35.0.1/index.html index 685160a1b1..08114b3d5d 100644 --- a/release-notes/35.0.1/index.html +++ b/release-notes/35.0.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.0.1

    Clients

    diff --git a/release-notes/35.1.0/index.html b/release-notes/35.1.0/index.html index e3b42d197b..bde87c248d 100644 --- a/release-notes/35.1.0/index.html +++ b/release-notes/35.1.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.1.0

    General

    diff --git a/release-notes/35.1.1/index.html b/release-notes/35.1.1/index.html index 84b36cefba..d488db0d7d 100644 --- a/release-notes/35.1.1/index.html +++ b/release-notes/35.1.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.1.1

    General

    diff --git a/release-notes/35.2.0/index.html b/release-notes/35.2.0/index.html index 9e55602548..0301da33fd 100644 --- a/release-notes/35.2.0/index.html +++ b/release-notes/35.2.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.2.0

    General

    diff --git a/release-notes/35.2.1/index.html b/release-notes/35.2.1/index.html index 7fba108999..f3d9a7ef6f 100644 --- a/release-notes/35.2.1/index.html +++ b/release-notes/35.2.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.2.1

    General

    diff --git a/release-notes/35.3.0/index.html b/release-notes/35.3.0/index.html index 72220ae9fe..18974fa9c1 100644 --- a/release-notes/35.3.0/index.html +++ b/release-notes/35.3.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.3.0

    General

    diff --git a/release-notes/35.4.0/index.html b/release-notes/35.4.0/index.html index 422d87b613..aacd4f0e6b 100644 --- a/release-notes/35.4.0/index.html +++ b/release-notes/35.4.0/index.html @@ -9,8 +9,8 @@ - - + +

    35.4.0

    General

    diff --git a/release-notes/35.4.1/index.html b/release-notes/35.4.1/index.html index 74bfb05f63..f8b7f83ba4 100644 --- a/release-notes/35.4.1/index.html +++ b/release-notes/35.4.1/index.html @@ -9,8 +9,8 @@ - - + +

    35.4.1

    General

    diff --git a/release-notes/index.html b/release-notes/index.html index ef789694c0..92454d5dd1 100644 --- a/release-notes/index.html +++ b/release-notes/index.html @@ -9,8 +9,8 @@ - - + +

    Release Notes

    We list the release notes in reverse chronological order, with the newest diff --git a/rucio_advisory_board/index.html b/rucio_advisory_board/index.html index 0f4b73617c..8901ca6b2a 100644 --- a/rucio_advisory_board/index.html +++ b/rucio_advisory_board/index.html @@ -9,8 +9,8 @@ - - + +

    +
    VersionCreation
    v1.1May 8, 2024
    v1.0Nov 7, 2022
    \ No newline at end of file diff --git a/search/index.html b/search/index.html index ecb3c999d7..c0e47d6585 100644 --- a/search/index.html +++ b/search/index.html @@ -9,8 +9,8 @@ - - + +

    Search the documentation

    diff --git a/sig_metadata/index.html b/sig_metadata/index.html index bebb42ed4b..fdec8ae5d1 100644 --- a/sig_metadata/index.html +++ b/sig_metadata/index.html @@ -9,8 +9,8 @@ - - + +
    +
    DocumentCreation
    Rucio SIG Metadata interim reportMar 25, 2024
    \ No newline at end of file diff --git a/sig_qualityofservice/index.html b/sig_qualityofservice/index.html index cf0e6052ec..22c40787db 100644 --- a/sig_qualityofservice/index.html +++ b/sig_qualityofservice/index.html @@ -9,8 +9,8 @@ - - + +
    +

    Doug Benjamin

    \ No newline at end of file diff --git a/sig_tokens/index.html b/sig_tokens/index.html index 7da693ad75..ca2595f506 100644 --- a/sig_tokens/index.html +++ b/sig_tokens/index.html @@ -9,8 +9,8 @@ - - + +
    +
    VersionCreation
    v0.1Sep 25, 2023
    \ No newline at end of file diff --git a/special_interest_groups/index.html b/special_interest_groups/index.html index e23dd3c78e..e6b6857343 100644 --- a/special_interest_groups/index.html +++ b/special_interest_groups/index.html @@ -9,8 +9,8 @@ - - + +
    +
    NameStartEndConvener
    Quality of ServiceJul-2021Dec-2023Doug Benjamin
    \ No newline at end of file diff --git a/started/additional_layers_and_resources/index.html b/started/additional_layers_and_resources/index.html index cfcd7bf516..8cd2dbd804 100644 --- a/started/additional_layers_and_resources/index.html +++ b/started/additional_layers_and_resources/index.html @@ -9,8 +9,8 @@ - - + +

    Additional Layers and Resources

    In addition to the four main layers, we have the storage @@ -36,6 +36,6 @@ database.

    The persistence layer supports many different types of transactions relational database management systems such as SQLite, MySQL, PostgreSQL, or Oracle. Both -upgrading & downgrading of the database schema are supported.

    +upgrading & downgrading of the database schema are supported.

    \ No newline at end of file diff --git a/started/before_you_get_started/index.html b/started/before_you_get_started/index.html index f87d2e6335..7a70642252 100644 --- a/started/before_you_get_started/index.html +++ b/started/before_you_get_started/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/accounting_and_quota/index.html b/started/concepts/accounting_and_quota/index.html index 0841b884ef..2ffd035b18 100644 --- a/started/concepts/accounting_and_quota/index.html +++ b/started/concepts/accounting_and_quota/index.html @@ -9,8 +9,8 @@ - - + +

    Accounting and quota

    Accounting is the measure of how much resource, e.g. storage, an account @@ -21,6 +21,6 @@ not on the actual amount of physical replicas in the system. Thus if two different users set a replication rule for the same file on the same RSE both users are accounted for this file, although there is only one -physical copy of it.

    +physical copy of it.

    \ No newline at end of file diff --git a/started/concepts/file_dataset_container/index.html b/started/concepts/file_dataset_container/index.html index bcad4ffebc..bd247fb3fe 100644 --- a/started/concepts/file_dataset_container/index.html +++ b/started/concepts/file_dataset_container/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/metadata_attributes/index.html b/started/concepts/metadata_attributes/index.html index 1ddd51759f..7a8c345cf3 100644 --- a/started/concepts/metadata_attributes/index.html +++ b/started/concepts/metadata_attributes/index.html @@ -9,8 +9,8 @@ - - + +

    Metadata attributes

    Meta-data associated with a dataset/file is represented using @@ -29,6 +29,6 @@

    For datasets, it is possible that the value of a meta-data attribute is a function of the meta-data of its constituents, e.g. the total size is the sum of the sizes of the constituents. In this case it is not -possible to assign a value to it.

    +possible to assign a value to it.

    \ No newline at end of file diff --git a/started/concepts/notifications/index.html b/started/concepts/notifications/index.html index 660e847dee..b88e9b97ed 100644 --- a/started/concepts/notifications/index.html +++ b/started/concepts/notifications/index.html @@ -9,14 +9,14 @@ - - + +

    Notifications

    External applications can require synchronisation on events relative to data availability and can subscribe to particular events, e.g., dataset state changes, replication rule state changes, etc. Rucio publishes messages via the STOMP protocol (to e.g. -ActiveMQ) when these events happen.

    +ActiveMQ) when these events happen.

    \ No newline at end of file diff --git a/started/concepts/permission_model/index.html b/started/concepts/permission_model/index.html index dc56e97288..b73325f840 100644 --- a/started/concepts/permission_model/index.html +++ b/started/concepts/permission_model/index.html @@ -9,8 +9,8 @@ - - + +

    Permission model

    Rucio assigns permissions to accounts. Permissions are boolean flags @@ -18,6 +18,6 @@ write, delete) on a resource (RSE, account, replica, etc.).

    Rucio comes with a generic permission policy including a typical set of permissions. This policy can be replaced with a more fitting permission -file representing the policies of the community using Rucio.

    +file representing the policies of the community using Rucio.

    \ No newline at end of file diff --git a/started/concepts/replica_management/index.html b/started/concepts/replica_management/index.html index 3afd2005e9..b5c722086a 100644 --- a/started/concepts/replica_management/index.html +++ b/started/concepts/replica_management/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/replica_workflow/index.html b/started/concepts/replica_workflow/index.html index a953e86ed2..975b99bc2a 100644 --- a/started/concepts/replica_workflow/index.html +++ b/started/concepts/replica_workflow/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/started/concepts/replication_rules_examples/index.html b/started/concepts/replication_rules_examples/index.html index be3d44efb9..bc9e6732c9 100644 --- a/started/concepts/replication_rules_examples/index.html +++ b/started/concepts/replication_rules_examples/index.html @@ -9,8 +9,8 @@ - - + +

    Replication rule examples

    Replica management is based on replication rules defined on data identifiers. A @@ -33,6 +33,6 @@

    username@host:~$ rucio list-rses --rses 'tier=1'

    I want to have 2 replicas on whatever T2 RSEs in the UK but not in Glasgow

    -
    username@host:~$ rucio add-rule scope:first_dataset scope:second_dataset 2 'tier=2&country=uk\site=GLASGOW'
    +
    username@host:~$ rucio add-rule scope:first_dataset scope:second_dataset 2 'tier=2&country=uk\site=GLASGOW'
    \ No newline at end of file diff --git a/started/concepts/rse_expressions/index.html b/started/concepts/rse_expressions/index.html index 5a3ce66470..d67ebaa6d7 100644 --- a/started/concepts/rse_expressions/index.html +++ b/started/concepts/rse_expressions/index.html @@ -9,8 +9,8 @@ - - + +

    RSE Expressions

    An RSE Expression allows to select a set of RSEs, for example to @@ -90,6 +90,6 @@

    Co
    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'cloud=IT|cloud=FR&type=SCRATCHDISK' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    '(cloud=IT|cloud=FR)&type=SCRATCHDISK' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'type=SCRATCHDISK&(cloud=IT|cloud=FR)' | wc -l
    30

    jbogadog@lxplus0100:~$ rucio list-rses --rses \
    'type=SCRATCHDISK&cloud=IT|cloud=FR' | wc -l
    92

    While the first three operations are equivalent, the last return sites in cloud FR but not only the SCRATCHDISKs but the GROUPDISKs and DATADISKs too, -among other types.

    +among other types.

    \ No newline at end of file diff --git a/started/concepts/rucio_account/index.html b/started/concepts/rucio_account/index.html index 549364347f..c9443273cf 100644 --- a/started/concepts/rucio_account/index.html +++ b/started/concepts/rucio_account/index.html @@ -9,8 +9,8 @@ - - + +

    Rucio account

    A Rucio account is the unit of assigning privileges in Rucio. It can represent @@ -24,6 +24,6 @@ accounts (N:M mapping). The Rucio authentication system checks if the used credentials are authorized to use the supplied Rucio account. The figure below gives an example of the mapping between credentials and Rucio accounts:

    -

    Figure 1

    +

    Figure 1

    \ No newline at end of file diff --git a/started/concepts/rucio_storage_element/index.html b/started/concepts/rucio_storage_element/index.html index dd79fd28c4..4af18a2615 100644 --- a/started/concepts/rucio_storage_element/index.html +++ b/started/concepts/rucio_storage_element/index.html @@ -9,8 +9,8 @@ - - + +

    Rucio Storage Element

    A Rucio Storage Element (RSE) is the logical abstraction of a storage system for @@ -42,6 +42,6 @@

    Dista

    When configuring transfers between RSEs, distances must be defined for that link. Distances are unidirectional. To allow transfers in both directions, a distance has to be defined separately in each direction. Refer to the section -Transfers Overview for more details.

    +Transfers Overview for more details.

    \ No newline at end of file diff --git a/started/concepts/subscriptions/index.html b/started/concepts/subscriptions/index.html index bf0e66cbf7..6af1696a49 100644 --- a/started/concepts/subscriptions/index.html +++ b/started/concepts/subscriptions/index.html @@ -9,8 +9,8 @@ - - + +

    Subscriptions

    Rucio Subscriptions exist for the purpose of making data placement @@ -20,6 +20,6 @@ generate rules for that account. Policies may have a lifetime, after which they will expire.

    An example of a subscription is given below:

    -
    AttributeValue
    Ownertzero
    matchproject=data11 7TeV, dataType=RAW, stream=physics*
    rule1@CERNTAPE, 1@T1TAPE
    lifetime2012-01-01 00:00
    +
    AttributeValue
    Ownertzero
    matchproject=data11 7TeV, dataType=RAW, stream=physics*
    rule1@CERNTAPE, 1@T1TAPE
    lifetime2012-01-01 00:00
    \ No newline at end of file diff --git a/started/main_components/index.html b/started/main_components/index.html index ee67c3f949..eacf1a4e64 100644 --- a/started/main_components/index.html +++ b/started/main_components/index.html @@ -9,8 +9,8 @@ - - + + +scientific paper.

    \ No newline at end of file diff --git a/started/releasepolicy/index.html b/started/releasepolicy/index.html index cce5094c46..3a5a9cb52a 100644 --- a/started/releasepolicy/index.html +++ b/started/releasepolicy/index.html @@ -9,8 +9,8 @@ - - + +

    Release Policy

    Rucio follows a release policy, based on semantic versioning, @@ -79,6 +79,6 @@

    Jupyter
  • For JupyterLab v3.x use the latest supported version (v0.10.0).
  • Please refer to the Rucio JupyterLab extension project for more details on -installation, requirements and release policy.

    +installation, requirements and release policy.

    \ No newline at end of file diff --git a/started/requirements/index.html b/started/requirements/index.html index 1d606c16e7..fa436a1b3f 100644 --- a/started/requirements/index.html +++ b/started/requirements/index.html @@ -9,8 +9,8 @@ - - + +
    >=3.6, <=3.9
    from 32 LTS>=3.9, <=3.10

    Database

    -
    DatabaseSupported versionNote
    SQLite3+For testing only
    MySQL8No support for SSH public key authentication
    PostgreSQL12 and higher
    Oracle19c
    +
    DatabaseSupported versionNote
    SQLite3+For testing only
    MySQL8No support for SSH public key authentication
    PostgreSQL12 and higher
    Oracle19c
    \ No newline at end of file diff --git a/started/what_is_rucio/index.html b/started/what_is_rucio/index.html index 3716ce709b..c9eea8e1f8 100644 --- a/started/what_is_rucio/index.html +++ b/started/what_is_rucio/index.html @@ -9,8 +9,8 @@ - - + +

    What is Rucio?

    Rucio enables centralized management of large volumes of data backed by many @@ -56,6 +56,6 @@

    What can R

    What Rucio doesn't do

    Rucio doesn't automatically create the storage backends. The storage servers must be created and configured, in advance, with one of the supported access protocols -(webdav/s3/sftp/xrootd/...), then configured in Rucio.

    +(webdav/s3/sftp/xrootd/...), then configured in Rucio.

    \ No newline at end of file diff --git a/user/configuring_the_client/index.html b/user/configuring_the_client/index.html index 4c96a17eab..319f069502 100644 --- a/user/configuring_the_client/index.html +++ b/user/configuring_the_client/index.html @@ -9,8 +9,8 @@ - - + + +
    \ No newline at end of file diff --git a/user/developing_with_rucio/index.html b/user/developing_with_rucio/index.html index 19f6c2fd0b..b29de4574e 100644 --- a/user/developing_with_rucio/index.html +++ b/user/developing_with_rucio/index.html @@ -9,8 +9,8 @@ - - + +

    Developing with Rucio

    Rucio Clients

    @@ -59,6 +59,6 @@

    Error handlin included in the header or the body of the return call, JSON-formatted with the parameters:

    ExceptionClass
    ExceptionMessage
    -

    Where ExceptionClass refers to Rucio Exceptions.

    +

    Where ExceptionClass refers to Rucio Exceptions.

    \ No newline at end of file diff --git a/user/setting_up_the_rucio_client/index.html b/user/setting_up_the_rucio_client/index.html index e8926cd66b..3b06ee3c85 100644 --- a/user/setting_up_the_rucio_client/index.html +++ b/user/setting_up_the_rucio_client/index.html @@ -9,8 +9,8 @@ - - + +

    Setting Up the Rucio Client

    Install via pip

    @@ -30,6 +30,6 @@

    Installing using setup.py

    Otherwise, you can install from the distribution using the setup.py script:

    -
    python setup.py install
    +
    python setup.py install
    \ No newline at end of file diff --git a/user/using_the_admin_client/index.html b/user/using_the_admin_client/index.html index 700c06f4e2..79f002250c 100644 --- a/user/using_the_admin_client/index.html +++ b/user/using_the_admin_client/index.html @@ -9,8 +9,8 @@ - - + +
    +
      $ rucio-admin replicas declare-bad --reason "File corrupted" https//path/to/lost/file
    \ No newline at end of file diff --git a/user/using_the_client/index.html b/user/using_the_client/index.html index c80b57edf5..afc34de7a9 100644 --- a/user/using_the_client/index.html +++ b/user/using_the_client/index.html @@ -9,8 +9,8 @@ - - + +

    Using the Client

    Rucio provides several commands for the end-user. See executables. @@ -146,6 +146,6 @@

    Rules opera

    Accessing files

    The command to download DIDs locally is called rucio download. It supports various sets of option. You can invoke it like this:

    -
    # rucio download user.jdoe:user.jdoe.test.container.1234.1
    2018-02-02 15:13:08,450 INFO Thread 1/3 : Starting the download of user.jdoe:test.file.2
    2018-02-02 15:13:08,451 INFO Thread 2/3 : Starting the download of user.jdoe:test.file.3
    2018-02-02 15:13:08,451 INFO Thread 3/3 : Starting the download of user.jdoe:test.file.1
    2018-02-02 15:13:08,503 INFO Thread 1/3 : File user.jdoe:test.file.2 trying \
    from SITE1_DISK
    2018-02-02 15:13:08,549 INFO Thread 2/3 : File user.jdoe:test.file.3 trying \
    from SITE2_DISK
    2018-02-02 15:13:08,551 INFO Thread 3/3 : File user.jdoe:test.file.1 trying \
    from SITE1_DISK
    2018-02-02 15:13:10,399 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,415 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded from SITE2_DISK
    2018-02-02 15:13:10,420 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded. 39.247 kB in 1.85 seconds = 0.02 MBps
    2018-02-02 15:13:10,537 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded. 641.427 kB in 1.87 seconds = 0.34 MBps
    2018-02-02 15:13:10,614 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,633 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded. 636.075 kB in 2.11 seconds = 0.3 MBps
    ----------------------------------
    Download summary
    ----------------------------------------
    DID user.jdoe:user.jdoe.test.container.1234.1
    Total files : 3
    Downloaded files : 3
    Files already found locally : 0
    Files that cannot be downloaded : 0
    +
    # rucio download user.jdoe:user.jdoe.test.container.1234.1
    2018-02-02 15:13:08,450 INFO Thread 1/3 : Starting the download of user.jdoe:test.file.2
    2018-02-02 15:13:08,451 INFO Thread 2/3 : Starting the download of user.jdoe:test.file.3
    2018-02-02 15:13:08,451 INFO Thread 3/3 : Starting the download of user.jdoe:test.file.1
    2018-02-02 15:13:08,503 INFO Thread 1/3 : File user.jdoe:test.file.2 trying \
    from SITE1_DISK
    2018-02-02 15:13:08,549 INFO Thread 2/3 : File user.jdoe:test.file.3 trying \
    from SITE2_DISK
    2018-02-02 15:13:08,551 INFO Thread 3/3 : File user.jdoe:test.file.1 trying \
    from SITE1_DISK
    2018-02-02 15:13:10,399 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,415 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded from SITE2_DISK
    2018-02-02 15:13:10,420 INFO Thread 3/3 : File user.jdoe:test.file.1 \
    successfully downloaded. 39.247 kB in 1.85 seconds = 0.02 MBps
    2018-02-02 15:13:10,537 INFO Thread 2/3 : File user.jdoe:test.file.3 \
    successfully downloaded. 641.427 kB in 1.87 seconds = 0.34 MBps
    2018-02-02 15:13:10,614 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded from SITE1_DISK
    2018-02-02 15:13:10,633 INFO Thread 1/3 : File user.jdoe:test.file.2 \
    successfully downloaded. 636.075 kB in 2.11 seconds = 0.3 MBps
    ----------------------------------
    Download summary
    ----------------------------------------
    DID user.jdoe:user.jdoe.test.container.1234.1
    Total files : 3
    Downloaded files : 3
    Files already found locally : 0
    Files that cannot be downloaded : 0
    \ No newline at end of file diff --git a/yaml/rest_api_doc_spec.yaml b/yaml/rest_api_doc_spec.yaml index 46e12a7c7a..32f4d093b4 100644 --- a/yaml/rest_api_doc_spec.yaml +++ b/yaml/rest_api_doc_spec.yaml @@ -141,6 +141,71 @@ security: paths: /static/{filename}: {} /accountlimits/local/{account}/{rse}: + delete: + summary: Delete a local account limit + tags: + - Account Limit + parameters: + - name: account + in: path + description: The account for the accountlimit. + schema: + type: string + style: simple + required: true + - name: rse + in: path + description: The rse for the accountlimit. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + '401': + description: Invalid Auth Token + '404': + description: No RSE or account found for the given id. + x-codeSamples: + - lang: Shell + source: |- + curl --request DELETE \ + --url http://undefinedundefined/accountlimits/local/{account}/{rse} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: >- + import requests + + + url = + "http://undefinedundefined/accountlimits/local/{account}/{rse}" + + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + + response = requests.request("DELETE", url, headers=headers) + + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = + 'http://undefinedundefined/accountlimits/local/{account}/{rse}'; + + + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); post: summary: Create or update a local account limit tags: @@ -234,8 +299,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /accountlimits/global/{account}/{rse_expression}: delete: - summary: Delete a local account limit + summary: Delete a global account limit tags: - Account Limit parameters: @@ -246,9 +312,9 @@ paths: type: string style: simple required: true - - name: rse + - name: rse_expression in: path - description: The rse for the accountlimit. + description: The rse expression for the accountlimit. schema: type: string style: simple @@ -264,7 +330,7 @@ paths: - lang: Shell source: |- curl --request DELETE \ - --url http://undefinedundefined/accountlimits/local/{account}/{rse} \ + --url http://undefinedundefined/accountlimits/global/{account}/{rse_expression} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- @@ -272,7 +338,7 @@ paths: url = - "http://undefinedundefined/accountlimits/local/{account}/{rse}" + "http://undefinedundefined/accountlimits/global/{account}/{rse_expression}" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -288,7 +354,7 @@ paths: let url = - 'http://undefinedundefined/accountlimits/local/{account}/{rse}'; + 'http://undefinedundefined/accountlimits/global/{account}/{rse_expression}'; let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': @@ -299,7 +365,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /accountlimits/global/{account}/{rse_expression}: post: summary: Create or update a global account limit tags: @@ -389,71 +454,6 @@ paths: }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Delete a global account limit - tags: - - Account Limit - parameters: - - name: account - in: path - description: The account for the accountlimit. - schema: - type: string - style: simple - required: true - - name: rse_expression - in: path - description: The rse expression for the accountlimit. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: No RSE or account found for the given id. - x-codeSamples: - - lang: Shell - source: |- - curl --request DELETE \ - --url http://undefinedundefined/accountlimits/global/{account}/{rse_expression} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: >- - import requests - - - url = - "http://undefinedundefined/accountlimits/global/{account}/{rse_expression}" - - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - - response = requests.request("DELETE", url, headers=headers) - - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = - 'http://undefinedundefined/accountlimits/global/{account}/{rse_expression}'; - - - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -949,71 +949,6 @@ paths: body: '{"identity":"string","authtype":"string","email":"string","password":"none","default":false}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: List identities - description: Lists all identities for an account. - tags: - - Account - parameters: - - name: account - in: path - description: The account identifier. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - content: - application/x-json-stream: - schema: - type: array - items: - type: array - minItems: 2 - maxItems: 2 - items: - type: string - '401': - description: Invalid Auth Token - '404': - description: Account not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/accounts/{account}/identities \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/accounts/{account}/identities" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/accounts/{account}/identities'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -1101,10 +1036,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /accounts/{account}/rules: get: - summary: List rules - description: Lists all rules for an account. + summary: List identities + description: Lists all identities for an account. tags: - Account parameters: @@ -1123,24 +1057,28 @@ paths: schema: type: array items: - type: string + type: array + minItems: 2 + maxItems: 2 + items: + type: string '401': description: Invalid Auth Token '404': - description: Account or rule not found + description: Account not found '406': description: Not acceptable x-codeSamples: - lang: Shell source: |- curl --request GET \ - --url http://undefinedundefined/accounts/{account}/rules \ + --url http://undefinedundefined/accounts/{account}/identities \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/accounts/{account}/rules" + url = "http://undefinedundefined/accounts/{account}/identities" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -1152,7 +1090,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/accounts/{account}/rules'; + let url = 'http://undefinedundefined/accounts/{account}/identities'; let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': @@ -1163,10 +1101,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /accounts/{account}/usage/history/{rse}: + /accounts/{account}/rules: get: - summary: Get account usage history - description: Returns the account usage history. + summary: List rules + description: Lists all rules for an account. tags: - Account parameters: @@ -1177,36 +1115,98 @@ paths: type: string style: simple required: true - - name: rse - in: path - description: The rse identifier. - schema: - type: string - style: simple - required: true responses: '200': description: OK content: - application/json: + application/x-json-stream: schema: type: array items: - type: object - properties: - bytes: - description: The number of bytes used. - type: integer - files: - description: The files. - type: string - updated_at: - description: When the data was provided. - type: string + type: string '401': description: Invalid Auth Token '404': - description: Account not found + description: Account or rule not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/accounts/{account}/rules \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/accounts/{account}/rules" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/accounts/{account}/rules'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + /accounts/{account}/usage/history/{rse}: + get: + summary: Get account usage history + description: Returns the account usage history. + tags: + - Account + parameters: + - name: account + in: path + description: The account identifier. + schema: + type: string + style: simple + required: true + - name: rse + in: path + description: The rse identifier. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + bytes: + description: The number of bytes used. + type: integer + files: + description: The files. + type: string + updated_at: + description: When the data was provided. + type: string + '401': + description: Invalid Auth Token + '404': + description: Account not found '406': description: Not acceptable x-codeSamples: @@ -1425,9 +1425,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /accounts/{account}: - put: - summary: Update - description: Update a parameter for an account. + post: + summary: Create + description: Create an account. tags: - Account parameters: @@ -1442,27 +1442,44 @@ paths: content: application/json: schema: - description: >- - Json object with key-value pairs corresponding to the new values - of the parameters. type: object + required: + - type + - email + properties: + type: + description: The account type. + type: string + enum: + - USER + - GROUP + - SERVICE + email: + description: The email for the account. + type: string responses: - '200': + '201': description: OK + content: + application/json: + schema: + type: string + enum: + - Created '400': description: Unknown status '401': description: Invalid Auth Token - '404': - description: No account found. + '409': + description: Account already exists x-codeSamples: - lang: Shell source: |- - curl --request PUT \ + curl --request POST \ --url http://undefinedundefined/accounts/{account} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{}' + --data '{"type":"USER","email":"string"}' - lang: Python source: >- import requests @@ -1471,7 +1488,10 @@ paths: url = "http://undefinedundefined/accounts/{account}" - payload = {} + payload = { + "type": "USER", + "email": "string" + } headers = { "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", @@ -1479,7 +1499,7 @@ paths: } - response = requests.request("PUT", url, json=payload, + response = requests.request("POST", url, json=payload, headers=headers) @@ -1491,18 +1511,71 @@ paths: let url = 'http://undefinedundefined/accounts/{account}'; let options = { - method: 'PUT', + method: 'POST', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{}' + body: '{"type":"USER","email":"string"}' }; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - post: - summary: Create - description: Create an account. + delete: + summary: Delete + description: Delete an account. + tags: + - Account + parameters: + - name: account + in: path + description: The account identifier. + schema: + type: string + style: simple + required: true + responses: + '201': + description: OK + '401': + description: Invalid Auth Token + '404': + description: Account not found + x-codeSamples: + - lang: Shell + source: |- + curl --request DELETE \ + --url http://undefinedundefined/accounts/{account} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/accounts/{account}" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("DELETE", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/accounts/{account}'; + + + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + put: + summary: Update + description: Update a parameter for an account. tags: - Account parameters: @@ -1517,44 +1590,27 @@ paths: content: application/json: schema: + description: >- + Json object with key-value pairs corresponding to the new values + of the parameters. type: object - required: - - type - - email - properties: - type: - description: The account type. - type: string - enum: - - USER - - GROUP - - SERVICE - email: - description: The email for the account. - type: string responses: - '201': + '200': description: OK - content: - application/json: - schema: - type: string - enum: - - Created '400': description: Unknown status '401': description: Invalid Auth Token - '409': - description: Account already exists + '404': + description: No account found. x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request PUT \ --url http://undefinedundefined/accounts/{account} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{"type":"USER","email":"string"}' + --data '{}' - lang: Python source: >- import requests @@ -1563,10 +1619,7 @@ paths: url = "http://undefinedundefined/accounts/{account}" - payload = { - "type": "USER", - "email": "string" - } + payload = {} headers = { "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", @@ -1574,7 +1627,7 @@ paths: } - response = requests.request("POST", url, json=payload, + response = requests.request("PUT", url, json=payload, headers=headers) @@ -1586,9 +1639,9 @@ paths: let url = 'http://undefinedundefined/accounts/{account}'; let options = { - method: 'POST', + method: 'PUT', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"type":"USER","email":"string"}' + body: '{}' }; fetch(url, options) @@ -1673,41 +1726,48 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - delete: - summary: Delete - description: Delete an account. + /accounts: + get: + summary: List + description: List all accounts. tags: - Account - parameters: - - name: account - in: path - description: The account identifier. - schema: - type: string - style: simple - required: true responses: - '201': + '200': description: OK + content: + application/x-json-stream: + schema: + type: array + items: + type: object + properties: + account: + description: The account identifier. + type: string + type: + description: The type. + type: string + email: + description: The email. + type: string '401': description: Invalid Auth Token - '404': - description: Account not found x-codeSamples: - lang: Shell source: |- - curl --request DELETE \ - --url http://undefinedundefined/accounts/{account} \ + curl --request GET \ + --url http://undefinedundefined/accounts \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/accounts/{account}" + url = "http://undefinedundefined/accounts" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("DELETE", url, headers=headers) + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node @@ -1715,10 +1775,10 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/accounts/{account}'; + let url = 'http://undefinedundefined/accounts'; - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -1726,48 +1786,54 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /accounts: - get: - summary: List - description: List all accounts. + /auth/userpass: + options: + summary: UserPass Allow cross-site scripting + description: UserPass Allow cross-site scripting. Explicit for Authentication. tags: - - Account + - Auth responses: '200': description: OK - content: - application/x-json-stream: + headers: + Access-Control-Allow-Origin: schema: - type: array - items: - type: object - properties: - account: - description: The account identifier. - type: string - type: - description: The type. - type: string - email: - description: The email. - type: string - '401': - description: Invalid Auth Token + type: string + Access-Control-Allow-Headers: + schema: + type: string + Access-Control-Allow-Methods: + schema: + type: string + enum: + - '*' + Access-Control-Allow-Credentials: + schema: + type: string + enum: + - 'true' + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token + '404': + description: Not found x-codeSamples: - lang: Shell source: |- - curl --request GET \ - --url http://undefinedundefined/accounts \ + curl --request OPTIONS \ + --url http://undefinedundefined/auth/userpass \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/accounts" + url = "http://undefinedundefined/auth/userpass" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers) + response = requests.request("OPTIONS", url, headers=headers) print(response.text) - lang: Node @@ -1775,10 +1841,10 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/accounts'; + let url = 'http://undefinedundefined/auth/userpass'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -1786,7 +1852,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/userpass: get: summary: UserPass description: Authenticate a Rucio account temporarily via username and password. @@ -1912,9 +1977,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/gss: options: - summary: UserPass Allow cross-site scripting - description: UserPass Allow cross-site scripting. Explicit for Authentication. + summary: GSS Allow cross-site scripting + description: GSS Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -1948,13 +2014,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/userpass \ + --url http://undefinedundefined/auth/gss \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/userpass" + url = "http://undefinedundefined/auth/gss" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -1966,7 +2032,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/userpass'; + let url = 'http://undefinedundefined/auth/gss'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -1977,7 +2043,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/gss: get: summary: GSS description: Authenticate a Rucio account via GSS. @@ -2064,9 +2129,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/x509: options: - summary: GSS Allow cross-site scripting - description: GSS Allow cross-site scripting. Explicit for Authentication. + summary: x509 Allow cross-site scripting + description: x509 Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2100,13 +2166,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/gss \ + --url http://undefinedundefined/auth/x509 \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/gss" + url = "http://undefinedundefined/auth/x509" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2118,7 +2184,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/gss'; + let url = 'http://undefinedundefined/auth/x509'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2129,7 +2195,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/x509: get: summary: x509 description: Authenticate a Rucio account via x509. @@ -2231,9 +2296,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/ssh: options: - summary: x509 Allow cross-site scripting - description: x509 Allow cross-site scripting. Explicit for Authentication. + summary: SSH Allow cross-site scripting + description: SSH Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2267,13 +2333,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/x509 \ + --url http://undefinedundefined/auth/ssh \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/x509" + url = "http://undefinedundefined/auth/ssh" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2285,7 +2351,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/x509'; + let url = 'http://undefinedundefined/auth/ssh'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2296,7 +2362,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/ssh: get: summary: SSH description: Authenticate a Rucio account via SSH. @@ -2383,9 +2448,12 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/ssh_challenge_token: options: - summary: SSH Allow cross-site scripting - description: SSH Allow cross-site scripting. Explicit for Authentication. + summary: SSHChallengeToken Allow cross-site scripting + description: >- + SSHChallengeToken Allow cross-site scripting. Explicit for + Authentication. tags: - Auth responses: @@ -2419,13 +2487,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/ssh \ + --url http://undefinedundefined/auth/ssh_challenge_token \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/ssh" + url = "http://undefinedundefined/auth/ssh_challenge_token" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2437,7 +2505,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/ssh'; + let url = 'http://undefinedundefined/auth/ssh_challenge_token'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2448,7 +2516,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/ssh_challenge_token: get: summary: SSHChallengeToken description: Authenticate a Rucio account via SSHChallengeToken. @@ -2527,55 +2594,32 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - options: - summary: SSHChallengeToken Allow cross-site scripting - description: >- - SSHChallengeToken Allow cross-site scripting. Explicit for - Authentication. + /auth/saml: + post: + summary: Post a SAML request + description: Post a SAML request tags: - Auth responses: '200': description: OK - headers: - Access-Control-Allow-Origin: - schema: - type: string - Access-Control-Allow-Headers: - schema: - type: string - Access-Control-Allow-Methods: - schema: - type: string - enum: - - '*' - Access-Control-Allow-Credentials: - schema: - type: string - enum: - - 'true' - Access-Control-Expose-Headers: - schema: - type: string - enum: - - X-Rucio-Auth-Token - '404': - description: Not found + '401': + description: Invalid Auth Token x-codeSamples: - lang: Shell source: |- - curl --request OPTIONS \ - --url http://undefinedundefined/auth/ssh_challenge_token \ + curl --request POST \ + --url http://undefinedundefined/auth/saml \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/ssh_challenge_token" + url = "http://undefinedundefined/auth/saml" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("OPTIONS", url, headers=headers) + response = requests.request("POST", url, headers=headers) print(response.text) - lang: Node @@ -2583,10 +2627,10 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/ssh_challenge_token'; + let url = 'http://undefinedundefined/auth/saml'; - let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + let options = {method: 'POST', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -2594,21 +2638,42 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/saml: - post: - summary: Post a SAML request - description: Post a SAML request + options: + summary: SAML Allow cross-site scripting + description: SAML Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: '200': description: OK - '401': - description: Invalid Auth Token + headers: + Access-Control-Allow-Origin: + schema: + type: string + Access-Control-Allow-Headers: + schema: + type: string + Access-Control-Allow-Methods: + schema: + type: string + enum: + - '*' + Access-Control-Allow-Credentials: + schema: + type: string + enum: + - 'true' + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token + '404': + description: Not found x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request OPTIONS \ --url http://undefinedundefined/auth/saml \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python @@ -2619,7 +2684,7 @@ paths: headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("POST", url, headers=headers) + response = requests.request("OPTIONS", url, headers=headers) print(response.text) - lang: Node @@ -2630,7 +2695,7 @@ paths: let url = 'http://undefinedundefined/auth/saml'; - let options = {method: 'POST', headers: {'X-Rucio-Auth-Token': + let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -2720,9 +2785,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/validate: options: - summary: SAML Allow cross-site scripting - description: SAML Allow cross-site scripting. Explicit for Authentication. + summary: Validate Allow cross-site scripting + description: Validate Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2756,13 +2822,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/saml \ + --url http://undefinedundefined/auth/validate \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/saml" + url = "http://undefinedundefined/auth/validate" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2774,7 +2840,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/saml'; + let url = 'http://undefinedundefined/auth/validate'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2785,7 +2851,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/validate: get: summary: Validate description: Validate a Rucio auth token. @@ -2841,9 +2906,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc: options: - summary: Validate Allow cross-site scripting - description: Validate Allow cross-site scripting. Explicit for Authentication. + summary: OIDC Allow cross-site scripting + description: OIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -2866,24 +2932,19 @@ paths: type: string enum: - 'true' - Access-Control-Expose-Headers: - schema: - type: string - enum: - - X-Rucio-Auth-Token '404': description: Not found x-codeSamples: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/validate \ + --url http://undefinedundefined/auth/oidc \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/validate" + url = "http://undefinedundefined/auth/oidc" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -2895,7 +2956,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/validate'; + let url = 'http://undefinedundefined/auth/oidc'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -2906,7 +2967,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc: get: summary: OIDC description: Authenticate a Rucio account via OIDC. @@ -3016,9 +3076,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_token: options: - summary: OIDC Allow cross-site scripting - description: OIDC Allow cross-site scripting. Explicit for Authentication. + summary: TokenOIDC Allow cross-site scripting + description: TokenOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3047,13 +3108,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc \ + --url http://undefinedundefined/auth/oidc_token \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc" + url = "http://undefinedundefined/auth/oidc_token" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3065,7 +3126,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc'; + let url = 'http://undefinedundefined/auth/oidc_token'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3076,7 +3137,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_token: get: summary: TokenOIDC description: Authenticate a Rucio account via TokenOIDC. @@ -3140,9 +3200,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_code: options: - summary: TokenOIDC Allow cross-site scripting - description: TokenOIDC Allow cross-site scripting. Explicit for Authentication. + summary: CodeOIDC Allow cross-site scripting + description: CodeOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3171,13 +3232,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_token \ + --url http://undefinedundefined/auth/oidc_code \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_token" + url = "http://undefinedundefined/auth/oidc_code" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3189,7 +3250,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_token'; + let url = 'http://undefinedundefined/auth/oidc_code'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3200,7 +3261,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_code: get: summary: CodeOIDC description: Authenticate a Rucio account via CodeOIDC. @@ -3255,9 +3315,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_redirect: options: - summary: CodeOIDC Allow cross-site scripting - description: CodeOIDC Allow cross-site scripting. Explicit for Authentication. + summary: RedirectOIDC Allow cross-site scripting + description: RedirectOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3286,13 +3347,13 @@ paths: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_code \ + --url http://undefinedundefined/auth/oidc_redirect \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_code" + url = "http://undefinedundefined/auth/oidc_redirect" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3304,7 +3365,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_code'; + let url = 'http://undefinedundefined/auth/oidc_redirect'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3315,7 +3376,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_redirect: get: summary: RedirectOIDC description: Authenticate a Rucio account via RedirectOIDC. @@ -3382,9 +3442,10 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /auth/oidc_refresh: options: - summary: RedirectOIDC Allow cross-site scripting - description: RedirectOIDC Allow cross-site scripting. Explicit for Authentication. + summary: RefreshOIDC Allow cross-site scripting + description: RefreshOIDC Allow cross-site scripting. Explicit for Authentication. tags: - Auth responses: @@ -3407,19 +3468,24 @@ paths: type: string enum: - 'true' + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token '404': description: Not found x-codeSamples: - lang: Shell source: |- curl --request OPTIONS \ - --url http://undefinedundefined/auth/oidc_redirect \ + --url http://undefinedundefined/auth/oidc_refresh \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- import requests - url = "http://undefinedundefined/auth/oidc_redirect" + url = "http://undefinedundefined/auth/oidc_refresh" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -3431,7 +3497,7 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_redirect'; + let url = 'http://undefinedundefined/auth/oidc_refresh'; let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': @@ -3442,7 +3508,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /auth/oidc_refresh: get: summary: RefreshOIDC description: Authenticate a Rucio account via RefreshOIDC. @@ -3456,99 +3521,29 @@ paths: required: true - name: X-Rucio-Auth-Token in: header - schema: - type: string - required: true - responses: - '200': - description: OK - headers: - X-Rucio-Auth-Token: - description: The authentication token - schema: - type: string - X-Rucio-Auth-Token-Expires: - description: The time when the token expires - schema: - type: string - '401': - description: Cannot authenticate - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/auth/oidc_refresh \ - --header 'X-Rucio-Account: SOME_STRING_VALUE' \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/auth/oidc_refresh" - - headers = { - "X-Rucio-Account": "SOME_STRING_VALUE", - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE" - } - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: |- - const fetch = require('node-fetch'); - - let url = 'http://undefinedundefined/auth/oidc_refresh'; - - let options = { - method: 'GET', - headers: { - 'X-Rucio-Account': 'SOME_STRING_VALUE', - 'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE' - } - }; - - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - options: - summary: RefreshOIDC Allow cross-site scripting - description: RefreshOIDC Allow cross-site scripting. Explicit for Authentication. - tags: - - Auth - responses: - '200': - description: OK - headers: - Access-Control-Allow-Origin: - schema: - type: string - Access-Control-Allow-Headers: - schema: - type: string - Access-Control-Allow-Methods: - schema: - type: string - enum: - - '*' - Access-Control-Allow-Credentials: + schema: + type: string + required: true + responses: + '200': + description: OK + headers: + X-Rucio-Auth-Token: + description: The authentication token schema: type: string - enum: - - 'true' - Access-Control-Expose-Headers: + X-Rucio-Auth-Token-Expires: + description: The time when the token expires schema: type: string - enum: - - X-Rucio-Auth-Token - '404': - description: Not found + '401': + description: Cannot authenticate x-codeSamples: - lang: Shell source: |- - curl --request OPTIONS \ + curl --request GET \ --url http://undefinedundefined/auth/oidc_refresh \ + --header 'X-Rucio-Account: SOME_STRING_VALUE' \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: |- @@ -3556,22 +3551,27 @@ paths: url = "http://undefinedundefined/auth/oidc_refresh" - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + headers = { + "X-Rucio-Account": "SOME_STRING_VALUE", + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE" + } - response = requests.request("OPTIONS", url, headers=headers) + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node - source: >- + source: |- const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/auth/oidc_refresh'; - - let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - + let options = { + method: 'GET', + headers: { + 'X-Rucio-Account': 'SOME_STRING_VALUE', + 'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE' + } + }; fetch(url, options) .then(res => res.json()) @@ -3659,9 +3659,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /config/{section}/{option}: - get: - summary: Get option - description: Returns the value of an option + delete: + summary: Delete option + description: Delete an option of a section. tags: - Config parameters: @@ -3682,21 +3682,12 @@ paths: responses: '200': description: OK - content: - application/json: - schema: - description: The value of the option - type: string '401': description: Invalid Auth Token - '404': - description: Config not found - '406': - description: Not acceptable x-codeSamples: - lang: Shell source: |- - curl --request GET \ + curl --request DELETE \ --url http://undefinedundefined/config/{section}/{option} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python @@ -3707,7 +3698,7 @@ paths: headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers) + response = requests.request("DELETE", url, headers=headers) print(response.text) - lang: Node @@ -3718,7 +3709,7 @@ paths: let url = 'http://undefinedundefined/config/{section}/{option}'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -3726,9 +3717,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - delete: - summary: Delete option - description: Delete an option of a section. + get: + summary: Get option + description: Returns the value of an option tags: - Config parameters: @@ -3749,12 +3740,21 @@ paths: responses: '200': description: OK + content: + application/json: + schema: + description: The value of the option + type: string '401': description: Invalid Auth Token + '404': + description: Config not found + '406': + description: Not acceptable x-codeSamples: - lang: Shell source: |- - curl --request DELETE \ + curl --request GET \ --url http://undefinedundefined/config/{section}/{option} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python @@ -3765,7 +3765,7 @@ paths: headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("DELETE", url, headers=headers) + response = requests.request("GET", url, headers=headers) print(response.text) - lang: Node @@ -3776,7 +3776,7 @@ paths: let url = 'http://undefinedundefined/config/{section}/{option}'; - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -3994,6 +3994,76 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /credentials/signurl: + options: + summary: Cross-Site Scripting + description: Allow cross-site scripting. Explicit for Authentication. + tags: + - Credentials + responses: + '200': + description: OK + headers: + Access-Control-Allow-Origin: + schema: + type: string + description: The http origin. + Access-Control-Allow-Headers: + schema: + type: string + description: The http access control request headers. + Access-Control-Allow-Methods: + schema: + type: string + enum: + - '*' + description: The allowed methods. + Access-Control-Allow-Credentials: + schema: + type: string + enum: + - 'true' + description: If credentials are allowed. + Access-Control-Expose-Headers: + schema: + type: string + enum: + - X-Rucio-Auth-Token + description: The exposed access control header. + '404': + description: Not found + x-codeSamples: + - lang: Shell + source: |- + curl --request OPTIONS \ + --url http://undefinedundefined/credentials/signurl \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/credentials/signurl" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("OPTIONS", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/credentials/signurl'; + + + let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); get: summary: Sign URL description: Sign a url for a limited lifetime for a particular srevice. @@ -4048,121 +4118,50 @@ paths: responses: '200': description: OK - content: - application/json: - schema: - type: array - items: - type: object - description: An account attribute. - properties: - key: - description: The key of the account attribute. - type: string - value: - description: The value of the account attribute. - type: string - '400': - description: bad request, no rse or url found. - '401': - description: Invalid Auth Token - '406': - description: Not acceptable. - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE' \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: >- - import requests - - - url = "http://undefinedundefined/credentials/signurl" - - - querystring = - {"rse":"SOME_STRING_VALUE","lifetime":"SOME_STRING_VALUE","svc":"SOME_STRING_VALUE","op":"SOME_STRING_VALUE","url":"SOME_STRING_VALUE"} - - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - - response = requests.request("GET", url, headers=headers, - params=querystring) - - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = - 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - options: - summary: Cross-Site Scripting - description: Allow cross-site scripting. Explicit for Authentication. - tags: - - Credentials - responses: - '200': - description: OK - headers: - Access-Control-Allow-Origin: - schema: - type: string - description: The http origin. - Access-Control-Allow-Headers: - schema: - type: string - description: The http access control request headers. - Access-Control-Allow-Methods: - schema: - type: string - enum: - - '*' - description: The allowed methods. - Access-Control-Allow-Credentials: - schema: - type: string - enum: - - 'true' - description: If credentials are allowed. - Access-Control-Expose-Headers: - schema: - type: string - enum: - - X-Rucio-Auth-Token - description: The exposed access control header. - '404': - description: Not found + content: + application/json: + schema: + type: array + items: + type: object + description: An account attribute. + properties: + key: + description: The key of the account attribute. + type: string + value: + description: The value of the account attribute. + type: string + '400': + description: bad request, no rse or url found. + '401': + description: Invalid Auth Token + '406': + description: Not acceptable. x-codeSamples: - lang: Shell source: |- - curl --request OPTIONS \ - --url http://undefinedundefined/credentials/signurl \ + curl --request GET \ + --url 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE' \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python - source: |- + source: >- import requests + url = "http://undefinedundefined/credentials/signurl" + + querystring = + {"rse":"SOME_STRING_VALUE","lifetime":"SOME_STRING_VALUE","svc":"SOME_STRING_VALUE","op":"SOME_STRING_VALUE","url":"SOME_STRING_VALUE"} + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("OPTIONS", url, headers=headers) + + response = requests.request("GET", url, headers=headers, + params=querystring) + print(response.text) - lang: Node @@ -4170,10 +4169,11 @@ paths: const fetch = require('node-fetch'); - let url = 'http://undefinedundefined/credentials/signurl'; + let url = + 'http://undefinedundefined/credentials/signurl?rse=SOME_STRING_VALUE&lifetime=SOME_STRING_VALUE&svc=SOME_STRING_VALUE&op=SOME_STRING_VALUE&url=SOME_STRING_VALUE'; - let options = {method: 'OPTIONS', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -5062,94 +5062,6 @@ paths: body: '{"rse":"string","account":"string","dids":{"account":"string","scope":"string","name":"string"}}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get did - description: Returns the contents of a data identifier. - tags: - - Data Identifiers - parameters: - - name: scope_name - in: path - description: The scope and the name of the did. - schema: - type: string - style: simple - required: true - responses: - '200': - description: Did found - content: - application/x-json-stream: - schema: - description: The contents of a did. Items are line separated. - type: array - items: - type: object - required: - - scope - - name - - type - - bytes - - adler32 - - md5 - properties: - scope: - description: The scope of the did. - type: string - name: - description: The name of the did. - type: string - type: - description: The type of the did. - type: string - bytes: - description: The size of the did. - type: number - adler32: - description: The adler32 checksum of the did. - type: string - md5: - description: The md5 checksum of the did. - type: string - '401': - description: Invalid Auth Token - '404': - description: Scope not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/dids/{scope_name}/dids \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/dids/{scope_name}/dids" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/dids/{scope_name}/dids'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -5239,6 +5151,94 @@ paths: body: '{"dids":[{"scope":"string","name":"string"}]}' }; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: Get did + description: Returns the contents of a data identifier. + tags: + - Data Identifiers + parameters: + - name: scope_name + in: path + description: The scope and the name of the did. + schema: + type: string + style: simple + required: true + responses: + '200': + description: Did found + content: + application/x-json-stream: + schema: + description: The contents of a did. Items are line separated. + type: array + items: + type: object + required: + - scope + - name + - type + - bytes + - adler32 + - md5 + properties: + scope: + description: The scope of the did. + type: string + name: + description: The name of the did. + type: string + type: + description: The type of the did. + type: string + bytes: + description: The size of the did. + type: number + adler32: + description: The adler32 checksum of the did. + type: string + md5: + description: The md5 checksum of the did. + type: string + '401': + description: Invalid Auth Token + '404': + description: Scope not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/dids/{scope_name}/dids \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/dids/{scope_name}/dids" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/dids/{scope_name}/dids'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -5339,9 +5339,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - get: - summary: Get metadata - description: Get the metadata of a did. + delete: + summary: Delete metadata + description: Deletes the specified metadata from the did. tags: - Data Identifiers parameters: @@ -5352,31 +5352,29 @@ paths: type: string style: simple required: true - - name: plugin + - name: key in: query - description: The plugin to use. + description: The key to delete. schema: type: string - default: DID_COLUMN responses: '200': description: OK - content: - application/json: - schema: - description: A data identifier with all attributes. - type: object + '400': + description: scope_name could not be parsed. '401': description: Invalid Auth Token '404': - description: Did not found + description: Did or key not found '406': description: Not acceptable + '409': + description: Feature is not in current database. x-codeSamples: - lang: Shell source: |- - curl --request GET \ - --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \ + curl --request DELETE \ + --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- @@ -5386,13 +5384,13 @@ paths: url = "http://undefinedundefined/dids/{scope_name}/meta" - querystring = {"plugin":"SOME_STRING_VALUE"} + querystring = {"key":"SOME_STRING_VALUE"} headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers, + response = requests.request("DELETE", url, headers=headers, params=querystring) @@ -5403,20 +5401,20 @@ paths: let url = - 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE'; + 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE'; - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Delete metadata - description: Deletes the specified metadata from the did. + .catch(err => console.error('error:' + err)); + get: + summary: Get metadata + description: Get the metadata of a did. tags: - Data Identifiers parameters: @@ -5427,29 +5425,31 @@ paths: type: string style: simple required: true - - name: key + - name: plugin in: query - description: The key to delete. + description: The plugin to use. schema: type: string + default: DID_COLUMN responses: '200': description: OK - '400': - description: scope_name could not be parsed. + content: + application/json: + schema: + description: A data identifier with all attributes. + type: object '401': description: Invalid Auth Token '404': - description: Did or key not found + description: Did not found '406': description: Not acceptable - '409': - description: Feature is not in current database. x-codeSamples: - lang: Shell source: |- - curl --request DELETE \ - --url 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE' \ + curl --request GET \ + --url 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE' \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- @@ -5459,13 +5459,13 @@ paths: url = "http://undefinedundefined/dids/{scope_name}/meta" - querystring = {"key":"SOME_STRING_VALUE"} + querystring = {"plugin":"SOME_STRING_VALUE"} headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("DELETE", url, headers=headers, + response = requests.request("GET", url, headers=headers, params=querystring) @@ -5476,10 +5476,10 @@ paths: let url = - 'http://undefinedundefined/dids/{scope_name}/meta?key=SOME_STRING_VALUE'; + 'http://undefinedundefined/dids/{scope_name}/meta?plugin=SOME_STRING_VALUE'; - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE'}}; @@ -5988,75 +5988,6 @@ paths: body: '{"account":"string"}' }; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - get: - summary: Get followers - description: Get all followers for a specific did. - tags: - - Data Identifiers - parameters: - - name: scope_name - in: path - description: The scope and the name of the did. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - content: - application/json: - schema: - description: A list of all followers of a did. - type: array - items: - description: A follower of a did. - type: object - properties: - user: - description: The user which follows the did. - type: string - '400': - description: Value error - '401': - description: Invalid Auth Token - '404': - description: Did not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request GET \ - --url http://undefinedundefined/dids/{scope_name}/follow \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/dids/{scope_name}/follow" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("GET", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/dids/{scope_name}/follow'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -6135,6 +6066,75 @@ paths: body: '{"account":"string"}' }; + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + get: + summary: Get followers + description: Get all followers for a specific did. + tags: + - Data Identifiers + parameters: + - name: scope_name + in: path + description: The scope and the name of the did. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + content: + application/json: + schema: + description: A list of all followers of a did. + type: array + items: + description: A follower of a did. + type: object + properties: + user: + description: The user which follows the did. + type: string + '400': + description: Value error + '401': + description: Invalid Auth Token + '404': + description: Did not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request GET \ + --url http://undefinedundefined/dids/{scope_name}/follow \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/dids/{scope_name}/follow" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/dids/{scope_name}/follow'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -12332,9 +12332,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /rses/{source}/distances/{destination}: - put: - summary: Update Rse Distance - description: Update rse distance information. + post: + summary: Create Rse Distance + description: Post a rse distance. tags: - Rucio Storage Elements parameters: @@ -12359,21 +12359,109 @@ paths: type: object properties: distance: - description: The distance between the RSEs. + description: The distance between RSEs. type: integer ranking: deprecated: true description: Same as distance. type: integer responses: - '201': + '201': + description: OK + content: + application/json: + schema: + type: string + enum: + - Created + '401': + description: Invalid Auth Token + '404': + description: Rse not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request POST \ + --url http://undefinedundefined/rses/{source}/distances/{destination} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ + --header 'content-type: application/json' \ + --data '{"distance":0,"ranking":0}' + - lang: Python + source: >- + import requests + + + url = + "http://undefinedundefined/rses/{source}/distances/{destination}" + + + payload = { + "distance": 0, + "ranking": 0 + } + + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } + + + response = requests.request("POST", url, json=payload, + headers=headers) + + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = + 'http://undefinedundefined/rses/{source}/distances/{destination}'; + + + let options = { + method: 'POST', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"distance":0,"ranking":0}' + }; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + delete: + summary: Delete Rse Distance + description: Delete distance information between source RSE and destination RSE. + tags: + - Rucio Storage Elements + parameters: + - name: source + in: path + description: The name of the source Rucio Storage Element. + schema: + type: string + style: simple + required: true + - name: destination + in: path + description: The name of the destination Rucio Storage Element. + schema: + type: string + style: simple + required: true + responses: + '200': description: OK content: application/json: schema: type: string enum: - - Created + - Deleted '401': description: Invalid Auth Token '404': @@ -12383,11 +12471,9 @@ paths: x-codeSamples: - lang: Shell source: |- - curl --request PUT \ + curl --request DELETE \ --url http://undefinedundefined/rses/{source}/distances/{destination} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ - --header 'content-type: application/json' \ - --data '{"distance":0,"ranking":0}' + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- import requests @@ -12397,19 +12483,10 @@ paths: "http://undefinedundefined/rses/{source}/distances/{destination}" - payload = { - "distance": 0, - "ranking": 0 - } - - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("PUT", url, json=payload, - headers=headers) + response = requests.request("DELETE", url, headers=headers) print(response.text) @@ -12422,20 +12499,17 @@ paths: 'http://undefinedundefined/rses/{source}/distances/{destination}'; - let options = { - method: 'PUT', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"distance":0,"ranking":0}' - }; + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - post: - summary: Create Rse Distance - description: Post a rse distance. + put: + summary: Update Rse Distance + description: Update rse distance information. tags: - Rucio Storage Elements parameters: @@ -12460,7 +12534,7 @@ paths: type: object properties: distance: - description: The distance between RSEs. + description: The distance between the RSEs. type: integer ranking: deprecated: true @@ -12484,7 +12558,7 @@ paths: x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request PUT \ --url http://undefinedundefined/rses/{source}/distances/{destination} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ @@ -12509,7 +12583,7 @@ paths: } - response = requests.request("POST", url, json=payload, + response = requests.request("PUT", url, json=payload, headers=headers) @@ -12524,7 +12598,7 @@ paths: let options = { - method: 'POST', + method: 'PUT', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, body: '{"distance":0,"ranking":0}' }; @@ -12624,46 +12698,53 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); + /rses/{rse}/protocols/{scheme}/{hostname}/{port}: delete: - summary: Delete Rse Distance - description: Delete distance information between source RSE and destination RSE. + summary: Delete Protocol Attributes + description: Delete all protocol attributes. tags: - Rucio Storage Elements parameters: - - name: source + - name: rse in: path - description: The name of the source Rucio Storage Element. + description: The name of the Rucio Storage Element name. schema: type: string style: simple required: true - - name: destination + - name: scheme in: path - description: The name of the destination Rucio Storage Element. + description: The protocol identifier. + schema: + type: string + style: simple + required: true + - name: hostname + in: path + description: The hostname of the protocol. schema: type: string style: simple required: true + - name: port + in: path + description: The port of the protocol. + schema: + type: integer + style: simple + required: true responses: '200': description: OK - content: - application/json: - schema: - type: string - enum: - - Deleted '401': description: Invalid Auth Token '404': - description: Rse not found - '406': - description: Not acceptable + description: Rse not found or protocol not supported x-codeSamples: - lang: Shell source: |- curl --request DELETE \ - --url http://undefinedundefined/rses/{source}/distances/{destination} \ + --url http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - lang: Python source: >- @@ -12671,7 +12752,7 @@ paths: url = - "http://undefinedundefined/rses/{source}/distances/{destination}" + "http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port}" headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} @@ -12687,7 +12768,7 @@ paths: let url = - 'http://undefinedundefined/rses/{source}/distances/{destination}'; + 'http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port}'; let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': @@ -12698,7 +12779,6 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /rses/{rse}/protocols/{scheme}/{hostname}/{port}: put: summary: Update Protocol Attributes description: >- @@ -12901,86 +12981,6 @@ paths: 'REPLACE_KEY_VALUE'}}; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Delete Protocol Attributes - description: Delete all protocol attributes. - tags: - - Rucio Storage Elements - parameters: - - name: rse - in: path - description: The name of the Rucio Storage Element name. - schema: - type: string - style: simple - required: true - - name: scheme - in: path - description: The protocol identifier. - schema: - type: string - style: simple - required: true - - name: hostname - in: path - description: The hostname of the protocol. - schema: - type: string - style: simple - required: true - - name: port - in: path - description: The port of the protocol. - schema: - type: integer - style: simple - required: true - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: Rse not found or protocol not supported - x-codeSamples: - - lang: Shell - source: |- - curl --request DELETE \ - --url http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: >- - import requests - - - url = - "http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port}" - - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - - response = requests.request("DELETE", url, headers=headers) - - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = - 'http://undefinedundefined/rses/{rse}/protocols/{scheme}/{hostname}/{port}'; - - - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -13616,26 +13616,104 @@ paths: headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - response = requests.request("GET", url, headers=headers) + response = requests.request("GET", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/rses/{rse}/usage/history'; + + + let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + /rses/{rse}/limits: + delete: + summary: Delete Rse Limit + description: Delete an rse limit + tags: + - Rucio Storage Elements + parameters: + - name: rse + in: path + description: The name of the Rucio Storage Element name. + schema: + type: string + style: simple + required: true + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + description: The name of the limit. + type: string + responses: + '200': + description: OK + '401': + description: Invalid Auth Token + '404': + description: Rse not found + '406': + description: Not acceptable + x-codeSamples: + - lang: Shell + source: |- + curl --request DELETE \ + --url http://undefinedundefined/rses/{rse}/limits \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ + --header 'content-type: application/json' \ + --data '{"name":"string"}' + - lang: Python + source: >- + import requests + + + url = "http://undefinedundefined/rses/{rse}/limits" + + + payload = {"name": "string"} + + headers = { + "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", + "content-type": "application/json" + } + + + response = requests.request("DELETE", url, json=payload, + headers=headers) + print(response.text) - lang: Node - source: >- + source: |- const fetch = require('node-fetch'); + let url = 'http://undefinedundefined/rses/{rse}/limits'; - let url = 'http://undefinedundefined/rses/{rse}/usage/history'; - - - let options = {method: 'GET', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - + let options = { + method: 'DELETE', + headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, + body: '{"name":"string"}' + }; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - /rses/{rse}/limits: put: summary: Update Rse Limit description: Update an rse limit. @@ -13778,84 +13856,6 @@ paths: 'REPLACE_KEY_VALUE'}}; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Delete Rse Limit - description: Delete an rse limit - tags: - - Rucio Storage Elements - parameters: - - name: rse - in: path - description: The name of the Rucio Storage Element name. - schema: - type: string - style: simple - required: true - requestBody: - content: - application/json: - schema: - type: object - required: - - name - properties: - name: - description: The name of the limit. - type: string - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: Rse not found - '406': - description: Not acceptable - x-codeSamples: - - lang: Shell - source: |- - curl --request DELETE \ - --url http://undefinedundefined/rses/{rse}/limits \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ - --header 'content-type: application/json' \ - --data '{"name":"string"}' - - lang: Python - source: >- - import requests - - - url = "http://undefinedundefined/rses/{rse}/limits" - - - payload = {"name": "string"} - - headers = { - "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", - "content-type": "application/json" - } - - - response = requests.request("DELETE", url, json=payload, - headers=headers) - - - print(response.text) - - lang: Node - source: |- - const fetch = require('node-fetch'); - - let url = 'http://undefinedundefined/rses/{rse}/limits'; - - let options = { - method: 'DELETE', - headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"name":"string"}' - }; - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -13994,9 +13994,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /rses/{rse}: - put: - summary: Update RSE - description: Update RSE properties. + post: + summary: Create RSE + description: Creates a RSE with all the metadata. tags: - Rucio Storage Elements parameters: @@ -14013,15 +14013,6 @@ paths: schema: type: object properties: - availability_read: - description: The vailability of the RSE. - type: boolean - availability_write: - description: The vailability of the RSE. - type: boolean - availability_delete: - description: The vailability of the RSE. - type: boolean deterministic: description: If the pfn is generated deterministicly. type: boolean @@ -14040,9 +14031,15 @@ paths: country_name: description: The country name of the RSE. type: string + continent: + description: The continent of the RSE. + type: string time_zone: description: The time zone of the RSE. type: string + ISP: + description: The internet service provider of the RSE. + type: string rse_type: description: The rse type. type: string @@ -14055,6 +14052,22 @@ paths: longitude: description: The longitude of the RSE. type: number + ASN: + description: The access service network of the RSE. + type: string + availability: + description: The availability of the RSE. + type: integer + deprecated: true + availability_read: + description: If the RSE is readable. + type: boolean + availability_write: + description: If the RSE is writable. + type: boolean + availability_delete: + description: If the RSE is deletable. + type: boolean responses: '201': description: OK @@ -14065,19 +14078,21 @@ paths: enum: - Created '400': - description: Cannot decode json parameter dictionary or invalid option provided + description: Cannot decode json parameter dictionary '401': description: Invalid Auth Token '404': description: RSE not found + '409': + description: RSE already exists. x-codeSamples: - lang: Shell source: |- - curl --request PUT \ + curl --request POST \ --url http://undefinedundefined/rses/{rse} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{"availability_read":true,"availability_write":true,"availability_delete":true,"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","time_zone":"string","rse_type":"DISK","latitude":0,"longitude":0}' + --data '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' - lang: Python source: >- import requests @@ -14087,19 +14102,23 @@ paths: payload = { - "availability_read": True, - "availability_write": True, - "availability_delete": True, "deterministic": True, "volatile": True, "city": "string", "staging_area": "string", "region_code": "string", "country_name": "string", + "continent": "string", "time_zone": "string", + "ISP": "string", "rse_type": "DISK", "latitude": 0, - "longitude": 0 + "longitude": 0, + "ASN": "string", + "availability": 0, + "availability_read": True, + "availability_write": True, + "availability_delete": True } headers = { @@ -14108,7 +14127,7 @@ paths: } - response = requests.request("PUT", url, json=payload, + response = requests.request("POST", url, json=payload, headers=headers) @@ -14120,18 +14139,71 @@ paths: let url = 'http://undefinedundefined/rses/{rse}'; let options = { - method: 'PUT', + method: 'POST', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"availability_read":true,"availability_write":true,"availability_delete":true,"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","time_zone":"string","rse_type":"DISK","latitude":0,"longitude":0}' + body: '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' }; fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - post: - summary: Create RSE - description: Creates a RSE with all the metadata. + delete: + summary: Disable RSE + description: Disable a specific RSE. + tags: + - Rucio Storage Elements + parameters: + - name: rse + in: path + description: The name of the Rucio Storage Element name. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + '401': + description: Invalid Auth Token + '404': + description: RSE not found + x-codeSamples: + - lang: Shell + source: |- + curl --request DELETE \ + --url http://undefinedundefined/rses/{rse} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/rses/{rse}" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("DELETE", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/rses/{rse}'; + + + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); + put: + summary: Update RSE + description: Update RSE properties. tags: - Rucio Storage Elements parameters: @@ -14148,6 +14220,15 @@ paths: schema: type: object properties: + availability_read: + description: The vailability of the RSE. + type: boolean + availability_write: + description: The vailability of the RSE. + type: boolean + availability_delete: + description: The vailability of the RSE. + type: boolean deterministic: description: If the pfn is generated deterministicly. type: boolean @@ -14166,15 +14247,9 @@ paths: country_name: description: The country name of the RSE. type: string - continent: - description: The continent of the RSE. - type: string time_zone: description: The time zone of the RSE. type: string - ISP: - description: The internet service provider of the RSE. - type: string rse_type: description: The rse type. type: string @@ -14187,22 +14262,6 @@ paths: longitude: description: The longitude of the RSE. type: number - ASN: - description: The access service network of the RSE. - type: string - availability: - description: The availability of the RSE. - type: integer - deprecated: true - availability_read: - description: If the RSE is readable. - type: boolean - availability_write: - description: If the RSE is writable. - type: boolean - availability_delete: - description: If the RSE is deletable. - type: boolean responses: '201': description: OK @@ -14213,21 +14272,19 @@ paths: enum: - Created '400': - description: Cannot decode json parameter dictionary + description: Cannot decode json parameter dictionary or invalid option provided '401': description: Invalid Auth Token '404': description: RSE not found - '409': - description: RSE already exists. x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request PUT \ --url http://undefinedundefined/rses/{rse} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' + --data '{"availability_read":true,"availability_write":true,"availability_delete":true,"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","time_zone":"string","rse_type":"DISK","latitude":0,"longitude":0}' - lang: Python source: >- import requests @@ -14237,23 +14294,19 @@ paths: payload = { + "availability_read": True, + "availability_write": True, + "availability_delete": True, "deterministic": True, "volatile": True, "city": "string", "staging_area": "string", "region_code": "string", "country_name": "string", - "continent": "string", "time_zone": "string", - "ISP": "string", "rse_type": "DISK", "latitude": 0, - "longitude": 0, - "ASN": "string", - "availability": 0, - "availability_read": True, - "availability_write": True, - "availability_delete": True + "longitude": 0 } headers = { @@ -14262,7 +14315,7 @@ paths: } - response = requests.request("POST", url, json=payload, + response = requests.request("PUT", url, json=payload, headers=headers) @@ -14274,9 +14327,9 @@ paths: let url = 'http://undefinedundefined/rses/{rse}'; let options = { - method: 'POST', + method: 'PUT', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","continent":"string","time_zone":"string","ISP":"string","rse_type":"DISK","latitude":0,"longitude":0,"ASN":"string","availability":0,"availability_read":true,"availability_write":true,"availability_delete":true}' + body: '{"availability_read":true,"availability_write":true,"availability_delete":true,"deterministic":true,"volatile":true,"city":"string","staging_area":"string","region_code":"string","country_name":"string","time_zone":"string","rse_type":"DISK","latitude":0,"longitude":0}' }; fetch(url, options) @@ -14394,59 +14447,6 @@ paths: 'REPLACE_KEY_VALUE'}}; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Disable RSE - description: Disable a specific RSE. - tags: - - Rucio Storage Elements - parameters: - - name: rse - in: path - description: The name of the Rucio Storage Element name. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: RSE not found - x-codeSamples: - - lang: Shell - source: |- - curl --request DELETE \ - --url http://undefinedundefined/rses/{rse} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/rses/{rse}" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("DELETE", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/rses/{rse}'; - - - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -14587,6 +14587,58 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /rules/{rule_id}: + delete: + summary: Delete a replication rule + tags: + - Rule + parameters: + - name: rule_id + in: path + description: The id of the replication rule. + schema: + type: string + style: simple + required: true + responses: + '200': + description: OK + '401': + description: Invalid Auth Token + '404': + description: No rule found for the given id + x-codeSamples: + - lang: Shell + source: |- + curl --request DELETE \ + --url http://undefinedundefined/rules/{rule_id} \ + --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' + - lang: Python + source: |- + import requests + + url = "http://undefinedundefined/rules/{rule_id}" + + headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} + + response = requests.request("DELETE", url, headers=headers) + + print(response.text) + - lang: Node + source: >- + const fetch = require('node-fetch'); + + + let url = 'http://undefinedundefined/rules/{rule_id}'; + + + let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': + 'REPLACE_KEY_VALUE'}}; + + + fetch(url, options) + .then(res => res.json()) + .then(json => console.log(json)) + .catch(err => console.error('error:' + err)); put: summary: Update the replication rules parameters tags: @@ -14776,58 +14828,6 @@ paths: 'REPLACE_KEY_VALUE'}}; - fetch(url, options) - .then(res => res.json()) - .then(json => console.log(json)) - .catch(err => console.error('error:' + err)); - delete: - summary: Delete a replication rule - tags: - - Rule - parameters: - - name: rule_id - in: path - description: The id of the replication rule. - schema: - type: string - style: simple - required: true - responses: - '200': - description: OK - '401': - description: Invalid Auth Token - '404': - description: No rule found for the given id - x-codeSamples: - - lang: Shell - source: |- - curl --request DELETE \ - --url http://undefinedundefined/rules/{rule_id} \ - --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' - - lang: Python - source: |- - import requests - - url = "http://undefinedundefined/rules/{rule_id}" - - headers = {"X-Rucio-Auth-Token": "REPLACE_KEY_VALUE"} - - response = requests.request("DELETE", url, headers=headers) - - print(response.text) - - lang: Node - source: >- - const fetch = require('node-fetch'); - - - let url = 'http://undefinedundefined/rules/{rule_id}'; - - - let options = {method: 'DELETE', headers: {'X-Rucio-Auth-Token': - 'REPLACE_KEY_VALUE'}}; - - fetch(url, options) .then(res => res.json()) .then(json => console.log(json)) @@ -16033,9 +16033,9 @@ paths: .then(json => console.log(json)) .catch(err => console.error('error:' + err)); /subscriptions/{account}/{name}: - put: - summary: Update subscription - description: Update an existing subscription. + post: + summary: Create subscription + description: Create a new subscription tags: - Replicas parameters: @@ -16064,6 +16064,12 @@ paths: options: description: The values for the new subscription. type: object + required: + - filter + - replication_rules + - comments + - lifetime + - retroactive properties: filter: description: The filter for the subscription. @@ -16086,23 +16092,36 @@ paths: The priority/policyid for the subscription. Stored as policyid. type: integer + dry_run: + description: >- + The priority/policyid for the subscription. Stored as + policyid. + type: boolean + default: false responses: - '201': + '200': description: OK + content: + application/json: + schema: + description: The subscription Id for the new subscription. + type: string '400': description: Cannot decode json parameter list. '401': description: Invalid Auth Token '404': description: Not found + '406': + description: Not acceptable x-codeSamples: - lang: Shell source: |- - curl --request PUT \ + curl --request POST \ --url http://undefinedundefined/subscriptions/{account}/{name} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' + --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0,"dry_run":false}}' - lang: Python source: >- import requests @@ -16117,7 +16136,8 @@ paths: "comments": "string", "lifetime": "2019-08-24T14:15:22Z", "retroactive": True, - "priority": 0 + "priority": 0, + "dry_run": False }} headers = { "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", @@ -16125,7 +16145,7 @@ paths: } - response = requests.request("PUT", url, json=payload, + response = requests.request("POST", url, json=payload, headers=headers) @@ -16140,9 +16160,9 @@ paths: let options = { - method: 'PUT', + method: 'POST', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' + body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0,"dry_run":false}}' }; @@ -16150,9 +16170,9 @@ paths: .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('error:' + err)); - post: - summary: Create subscription - description: Create a new subscription + put: + summary: Update subscription + description: Update an existing subscription. tags: - Replicas parameters: @@ -16181,12 +16201,6 @@ paths: options: description: The values for the new subscription. type: object - required: - - filter - - replication_rules - - comments - - lifetime - - retroactive properties: filter: description: The filter for the subscription. @@ -16209,36 +16223,23 @@ paths: The priority/policyid for the subscription. Stored as policyid. type: integer - dry_run: - description: >- - The priority/policyid for the subscription. Stored as - policyid. - type: boolean - default: false responses: - '200': + '201': description: OK - content: - application/json: - schema: - description: The subscription Id for the new subscription. - type: string '400': description: Cannot decode json parameter list. '401': description: Invalid Auth Token '404': description: Not found - '406': - description: Not acceptable x-codeSamples: - lang: Shell source: |- - curl --request POST \ + curl --request PUT \ --url http://undefinedundefined/subscriptions/{account}/{name} \ --header 'X-Rucio-Auth-Token: REPLACE_KEY_VALUE' \ --header 'content-type: application/json' \ - --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0,"dry_run":false}}' + --data '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' - lang: Python source: >- import requests @@ -16253,8 +16254,7 @@ paths: "comments": "string", "lifetime": "2019-08-24T14:15:22Z", "retroactive": True, - "priority": 0, - "dry_run": False + "priority": 0 }} headers = { "X-Rucio-Auth-Token": "REPLACE_KEY_VALUE", @@ -16262,7 +16262,7 @@ paths: } - response = requests.request("POST", url, json=payload, + response = requests.request("PUT", url, json=payload, headers=headers) @@ -16277,9 +16277,9 @@ paths: let options = { - method: 'POST', + method: 'PUT', headers: {'X-Rucio-Auth-Token': 'REPLACE_KEY_VALUE', 'content-type': 'application/json'}, - body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0,"dry_run":false}}' + body: '{"options":{"filter":"string","replication_rules":"string","comments":"string","lifetime":"2019-08-24T14:15:22Z","retroactive":true,"priority":0}}' };