Cloud, DevOps & Automation
CLOUD & DEVOPS
Cloud, DevOps & Automation
Cloud technology allows to elaborate and store data outside traditional on-premise data centers, thus enabling delivery and use of computing resources on-demand through the Internet. Today, the Cloud is widely regarded as the fundamental ingredient of Digital Transformation, the crucial element in a business strategy that aims for growth and fast scalability while keeping costs low. No physical infrastructure, in fact, means less costs for buying hardware, maintaining it, and paying for IT personnel.
Optimizing processes thanks to the Cloud
For us at Extra Red, the Cloud isn’t just a physical place. It’s also a synonym for improvement, automation, application modernization. We are “Cloud Enablers”: we can create and maintain your Cloud environment (be it public, private, or hybrid), but we don’t just stop there. Migrating applications to the Cloud without transforming them appropriately makes no sense, therefore we shall also accompany you throughout each stage of the change and help you fully take advantage of this technology’s potential, by developing cloud-native applications, applications based on microservices and containerized applications. The foundation of this paradigm is the concept of “container”, that is, the set of source code which contains everything that’s needed to be deployed in any environment, and which can be migrated, transformed, and maintained independently from the other containers that make up an application. Every modern application built for the Cloud is made of multiple containers. When there are many containers, an orchestrator is needed. At Extra Red we use Red Hat OpenShift, the best “cloud operative system” available on the marketplace. Being extremely compatible, Red Hat OpenShift allows companies to install their applications regardless of the underlying physical, virtual or cloud environment. It also helps avoid cloud provider lock-ins and it’s essential when developing applications for hyperscalers such as AWS, Azure, Google.
Infrastructure management and DevOps synergy
The modern Cloud infrastructure management includes creating platforms that can manage a software application’s entire lifecycle, from coding to operations such as maintenance and monitoring. Such platforms are able not only to support application runtime, but can also offer a set of services essential to developers because usable on a self-service basis. By adopting this point of view, it’s easy to see that a tight collaboration between modern system administrators (ops) and developers responsible for an application’s lifecycle (dev) is born. Hence the DevOps methodology, a way to allow companies to drastically lower the Time-To-Market of applications and services and at the same time increase their reliability. Thanks to this method, building automation for routine activities becomes easier, enabling developers and operation teams to deploy them by using software suites when needed. This way, manual activities are reduced and business processes speed up considerably.
Are you interested in learning more about our technologies? Write to us!
Failed to "?eval" string with this error: ---begin-message--- Syntax error in ?eval-ed string in line 1, column 718: Lexical error: encountered "u" (117), after "\"Extra\\". ---end-message--- The failing expression: ==> entitiesListJson?eval [in template "20097#20123#53602" at line 72, column 29] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign entities = entitiesListJson?eval [in template "20097#20123#53602" at line 72, column 9] ----
1<#-- Blog Index Argomento ADT -->
2<#assign portletBackground = "bg-red-white" />
3<#list portletPreferences?keys as key>
4 <#if key=="portletBackground">
5 <#assign portletBackground=portletPreferences[key]?first />
6 </#if>
7</#list>
8
9<#assign dlAppServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")/>
10<#assign categoryService = serviceLocator.findService("it.extrared.redweb.commons.service.CategoryService") />
11<#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService") />
12<#assign assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
13<#assign dlFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') />
14
15<#assign contentTopic = languageUtil.get(locale, "content-topic") />
16<#assign noArticle = languageUtil.get(locale, "no-article") />
17<#assign readMore = languageUtil.get(locale, "read-all") />
18
19<#assign redSimilarJournalArticle = serviceLocator.findService("it.extrared.redweb.commons.service.SimilarJournalArticle") />
20<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
21
22<#assign article = "" />
23<#assign urlTitle = "" />
24
25<#assign dirtyUrlTitle = themeDisplay.getURLCurrent() />
26<#if dirtyUrlTitle?contains("curPage")>
27 <#assign curPage = paramUtil.getString(request, "curPage")?number />
28 <#assign last = dirtyUrlTitle?split("/")?last />
29 <#assign urlTitle = last?substring(0, last?index_of("?")) />
30<#elseif dirtyUrlTitle?contains("?wkrh___tabs1=properties")>
31 <#assign curPage = 1 />
32 <#assign last = themeDisplay.getURLCurrent()?split("/")?last />
33 <#assign urlTitle = last?substring(0, last?index_of('?wkrh___tabs1=properties')) />
34<#elseif dirtyUrlTitle?contains("_redirect")>
35 <#assign curPage = 1 />
36 <#assign urlTitle = dirtyUrlTitle?split("/")?last />
37<#else>
38 <#assign curPage = 1 />
39 <#assign urlTitle = dirtyUrlTitle?split("/")?last />
40</#if>
41
42<#assign logfactory = staticUtil["com.liferay.portal.kernel.log.LogFactoryUtil"] />
43<#assign log = logfactory.getLog("FreemarkerLog") />
44${log.debug("urlTitle: " + urlTitle)}
45
46<#attempt>
47 <#assign article = journalArticleLocalService.getArticleByUrlTitle(groupId, urlTitle) />
48<#recover>
49</#attempt>
50
51<#assign entitiesListJson = "" />
52<#assign total = 0 />
53<#assign delta = 0 />
54
55<#list portletPreferences?keys as k >
56 <#if k == "delta">
57 <#assign delta = portletPreferences[k]?first?number />
58 </#if>
59</#list>
60
61<input type="hidden" value="${curPage}" id="custom-curPage"/>
62
63<#if article?? && article?has_content>
64 <#assign entitiesListJson = redSimilarJournalArticle.getSimilarJournalArticlesWithConfig(portletPreferences, article.articleId, groupId, false, curPage?number) />
65 <#assign total = redSimilarJournalArticle.getSimilarJournalArticleCount(portletPreferences, article.articleId, groupId) />
66</#if>
67
68<#assign totalPages = (total/delta)?ceiling />
69
70<input type="hidden" value="${totalPages}" id="custom-totalPages"/>
71<#if entitiesListJson?? && entitiesListJson?has_content>
72 <#assign entities = entitiesListJson?eval />
73</#if>
74
75
76<#if entities?has_content && entities?size gt 0>
77 <section class="container-fluid ${portletBackground} custom-scroll-class" id="custom-scroll-class">
78 <div class="container col-xxl-12">
79 <div class="row">
80 <div class="col-12">
81 <div class="row align-items-center">
82 <div class="col-lg-4 col-12">
83 <span class="pb-5 text-muted">${contentTopic?upper_case}</span>
84 </div>
85 </div>
86 </div>
87 </div>
88 </div>
89 </section>
90
91 <section class="container-fluid pt-0 ${portletBackground}">
92 <div class="container">
93 <div class="row align-items-center pt-lg-5">
94 <#list entities?keys as k>
95 <#assign entitiesGroup=entities[k] />
96 <#if entitiesGroup?size gt 0>
97 <#list entitiesGroup as array>
98 <div class="col-lg-4 mb-5">
99 <#assign titolo = array["articleTitle"] />
100 <#assign articleId = array["articleId"] />
101 <#assign singleArticle = journalArticleLocalService.fetchArticle(groupId, articleId) />
102 <#assign categories = array["categoriesString"] />
103 <#assign displayPage = array["displayPage"] />
104 <#assign assetEntryId = array["assetEntryId"] />
105 <#assign assetEntry = assetEntryLocalService.getEntry(assetEntryId) />
106 <#assign categories = assetEntry.getCategories() />
107 <#assign urlImage = "" />
108 <#assign altImage = "" />
109 <#assign fileEntryId = "" />
110 <#if array["image"]?? && array["image"]?has_content>
111 <#assign docVal=array["image"]?eval />
112 <#if docVal.url?? && docVal.url?has_content>
113 <#assign urlImage = docVal.url />
114 </#if>
115 <#if docVal.title?? && docVal.title?has_content>
116 <#assign altImage = docVal.title />
117 </#if>
118 <#if docVal.fileEntryId?? && docVal.fileEntryId?has_content>
119 <#assign fileEntryId = docVal.fileEntryId />
120 </#if>
121 <div class="col-lg-9 col-9 col-sm-9 p-0">
122 <@adaptive_media_image["img"]
123 fileVersion=dlAppServiceUtil.getFileEntry(fileEntryId?number).getFileVersion()
124 width="100%"
125 height="auto"
126 alt="${altImage}"
127 class="mb-4"
128 />
129 <#--
130 <img width="100%" class="mb-4" height="auto" src="${urlImage}" alt="${altImage}" title="${titolo}">
131 -->
132 </div>
133 </#if>
134 <#--
135 <#list categoriesList as c>
136 <#attempt>
137 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
138 <#if typeProperty?? && typeProperty?has_content>
139 <#assign type = typeProperty.getValue() />
140 <#if type?? && type?has_content>
141 <div class="badge badge-pill badge-primary bg-red-red">${c.getTitle(locale)}</div>
142 </#if>
143 </#if>
144 <#recover>
145 </#attempt>
146 </#list>
147 -->
148 <div class="card-body pt-2">
149 <div class="card-subtitle text-muted">
150 <#list categories as c>
151 <#--
152 <#attempt>
153 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
154 <#if typeProperty?? && typeProperty?has_content>
155 <#assign type = typeProperty.getValue() />
156 <#if type?? && type?has_content>
157 ${c.getTitle(locale)?upper_case}
158 </#if>
159 </#if>
160 <#recover>
161 </#attempt>
162 -->
163 <#assign hasProperty = categoryService.hasCategoryProperty(c.getCategoryId(), "type") />
164 <#if hasProperty>
165 <#assign typeProperty = categoryService.getCategoryProperty(c.getCategoryId(), "type") />
166 <#if typeProperty?? && typeProperty?has_content && typeProperty == "true">
167 ${c.getTitle(locale)?upper_case}
168 </#if>
169 </#if>
170 </#list>
171
172 <#--
173 ${singleArticle.getDDMStructure().getName(locale)?upper_case}
174 -->
175 </div>
176 <#--
177 <#if categoriesList?? && categoriesList?has_content>
178 <div class="card-subtitle text-muted">
179 <#assign categoriesString = "" />
180 <#list categoriesList as c>
181 <#attempt>
182 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
183 <#recover>
184 <#if !categoriesString?has_content>
185 <#assign categoriesString = c.getTitle(locale)?upper_case />
186 <#else>
187 <#assign categoriesString = categoriesString + ", " + c.getTitle(locale)?upper_case />
188 </#if>
189 </#attempt>
190 </#list>
191 ${categoriesString}
192 </div>
193 <div class="card-subtitle text-muted">
194 ${categories?upper_case}
195 </div>
196 </#if>
197 -->
198 <a href="${displayPage}" target="_self" title="${titolo}">
199 <h3 class="m-0">${titolo}</h3>
200 </a>
201 </div>
202 </div>
203 </#list>
204 <#else>
205 <div class="container">
206 <h2 class="m-0 color50percent">${noArticle}</h2>
207 </div>
208 <a class="pt-5 align-middle" style="display: block" href="/blog">
209 <i class="align-middle me-2 material-icons-outlined">explore</i>
210 <span class="align-middle">${readMore?capitalize}</span>
211 </a>
212 </#if>
213 </#list>
214 </div>
215 </div>
216
217 <div class="lfr-pagination custom-pagination">
218 <ul class="lfr-pagination-buttons pagination">
219 <li class="page-item">
220 <a class="custom-pagination-prec <#if curPage == 1> disabled </#if>">
221 <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_back_ios</span>
222 </a>
223 </li>
224 <li class="page-item">
225 <a class="custom-pagination-succ <#if curPage == totalPages> disabled </#if>">
226 <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_forward_ios</span>
227 </a>
228 </li>
229 </ul>
230 </div>
231
232 </section>
233</#if>