Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TYPO3 8 is here - how we keep EXT:solr uptodate with the TYPO3 core

541 views

Published on

This presentation shows, how we use travis-ci.org and scrutinizer-ci.com to keep our extension uptodate with the TYPO3 core. Beside that we show what could be next for EXT:solr in the next year.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

TYPO3 8 is here - how we keep EXT:solr uptodate with the TYPO3 core

  1. 1. 1 Apache Solr for TYPO3: TYPO3 8 is here How we keep EXT:solr uptodate with the TYPO3 core
  2. 2. About me 2 Timo Hund 33 years old @TYPO3 since: 2003
 @Apache Solr since: 2009
 @dkd since: 2015
 
 Email: timo.hund@dkd.de Xing: https://www.xing.com/profile/Timo_Hund2
 Github: https://github.com/timohund

  3. 3. Our team 3 Olivier Dobberkau Timo Hund Ingo Renner Markus Friedrich Thomas Janke Development Development Development Management Management Rafael Kähm Development
  4. 4. 4 Teamwork@dkd
  5. 5. EXT:solr short overview Search Extension for TYPO3
 Started in 2009 (pi based) by Ingo Renner
 Code hosted on github: https://github.com/TYPO3-Solr/ext-solr
 Financed by dkd and partners 5
  6. 6. Agenda Our challenge How we tackle it The road to developers paradise What we achieved What can be next? 6
  7. 7. 7 Apache Solr for TYPO3: Our Challenge: Have EXT:solr ready for 8 LTS 2 days after the release
  8. 8. Our challenge • TYPO3 8 LTS on 4.4.2017 • EXT:solr 6.1 on 6.4.2017 • 7.6 LTS support kept • Addons (EXT:solrfal & solrfluid) too 8
  9. 9. Side effects • Frequent changes in EXT:solr and TYPO3 core shortly before the release • TYPO3 & EXT:solr need to work together • EXT:solr is moving • TYPO3 is moving • PHP, MySQL & Solr compatibility 9
  10. 10. 10 Apache Solr for TYPO3: How we tackle the challenge
  11. 11. How we tackle that • We test all combinations on every change
 • We test before merging into EXT:solr • We test continuously with TYPO3 core dev-master • We attend the LTS stabilization sprint in Aarhus 11
  12. 12. How does that look? 12 EXT:solr fork EXT:solr Test Pull Request Test continuously Code complexity Test coverage Copy & paste check master 7.0 6.3 master 7.1 6.3 7.6-dev 5.6 6.3 7.6-dev 5.5 6.3
  13. 13. travis-ci.org • Free for open source 
 projects :)
 • Support of multiple 
 environments
 • Integrated into github 
 (pull requests, forks, …)
 • Configured in .travis.yml file 13
  14. 14. Setup travis 14 • Enable on GitHub „Settings => Integration & Services => Add service“ • Enable build on travis-ci.org for the repository • Configure in .travis.yml
  15. 15. The .travis.yml* 15 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 language: php
 

  16. 16. The .travis.yml* 16 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 addons:
 apt:
 packages:
 - parallel
 

  17. 17. The .travis.yml* 17 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 

  18. 18. The .travis.yml* 18 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 

  19. 19. The .travis.yml* 19 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 

  20. 20. The .travis.yml* 20 language: php
 
 addons:
 apt:
 packages:
 - parallel
 
 env:
 global:
 - TYPO3_DATABASE_NAME="typo3_ci"
 - TYPO3_DATABASE_HOST="127.0.0.1"
 - TYPO3_DATABASE_USERNAME="root"
 - TYPO3_DATABASE_PASSWORD=""
 
 matrix:
 fast_finish: true
 include:
 - php: 5.5
 env: TYPO3_VERSION=^7.6
 - php: 5.6
 env: TYPO3_VERSION=^7.6
 - php: 7.0
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^7.6
 - php: 7.1
 env: TYPO3_VERSION=^8.7
 - php: 7.0
 env: TYPO3_VERSION=^8.7
 
 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 cache:
 directories:
 - $HOME/.composer/cache
 cache:
 directories:
 - $HOME/.composer/cache

  21. 21. scrutinizer-ci.com • Free for open source 
 projects :) • Helps to measure code quality • Simple rating between 
 0 and 10 • Can find bugs and proposes 
 refactoring • Configured in .scrutinizer.yml 21
  22. 22. The .scrutinizer.yml* 22 checks:
 php:
 code_rating: true
 duplication: true
 
 filter:
 paths:
 - 'Classes/*'
 
 tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
 
 build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0'
  23. 23. The .scrutinizer.yml* 23 checks:
 php:
 code_rating: true
 duplication: true
 
 filter:
 paths:
 - 'Classes/*'
 
 tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
 
 build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0' checks:
 php:
 code_rating: true
 duplication: true
  24. 24. The .scrutinizer.yml* 24 checks:
 php:
 code_rating: true
 duplication: true
 
 filter:
 paths:
 - 'Classes/*'
 
 tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
 
 build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0' filter:
 paths:
 - 'Classes/*'
  25. 25. The .scrutinizer.yml* 25 checks:
 php:
 code_rating: true
 duplication: true
 
 filter:
 paths:
 - 'Classes/*'
 
 tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
 
 build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0' tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
  26. 26. The .scrutinizer.yml* 26 checks:
 php:
 code_rating: true
 duplication: true
 
 filter:
 paths:
 - 'Classes/*'
 
 tools:
 php_cpd:
 enabled: true
 
 php_code_sniffer:
 enabled: true
 config:
 standard: TYPO3CMS
 
 # we do this on travis
 php_cs_fixer:
 enabled: false
 
 php_mess_detector:
 enabled: true
 config:
 controversial_rules:
 superglobals: false
 
 php_pdepend:
 enabled: true
 
 # coverage pushed from travis-ci.org
 external_code_coverage:
 # two runs unit and integration
 runs: 2
 timeout: 1800
 
 build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0' build_failure_conditions:
 - 'patches.label("Doc Comments").count > 0'
 - 'patches.label("Spacing").count > 0'
 - 'issues.label("coding-style").count > 0'
 - 'issues.severity(>= MAJOR).count > 0'
  27. 27. Conclusion 27 • Many services available for continuous integration with GitHub • travis-ci.org & scrutinizer-ci.com are a good combination Examples: • Full EXT:solr setup: https://github.com/TYPO3-Solr/ext-solr.git • Minimal setup: https://github.com/timohund/t3ciparadise.git Other Resources: • https://github.com/georgringer/news • https://github.com/Nimut/testing-framework • http://insight.helhum.io/
  28. 28. 28 Apache Solr for TYPO3: The road to testing paradise….
  29. 29. 29 The ideal world…. Acceptance Tests Integration / Functional Tests Unit Tests • High amount of independent unit tests • Medium amount of integration tests • Small amount of acceptance tests • Execution from bottom to top • Fast feedback • Reasonable coverage • Loosely coupled code • Discipline during development
  30. 30. 30 … and how we get closer Acceptance Tests Integration / Functional Tests Unit Tests • Old code: Adding unit tests is hard => dependencies • First add integration tests
  31. 31. 31 … and how we get closer Acceptance Tests Integration / Functional Tests Unit Tests • Old code: Adding unit tests is hard => dependencies • First add integration tests • Then refactor code parts and add unit tests • Advantages • Refactorings are tested • Bigger parts of the application are covered
  32. 32. How are tests executed? 32 • Do you remember the build steps in .travis.yml?
  33. 33. How does that look? 33 before_install:
 - composer self-update
 install:
 - Build/Test/bootstrap.sh
 script:
 - Build/Test/cibuild.sh
 after_script:
 - Build/Test/publish_coverage.sh
 
 •Do you remember the build steps in .travis.yml? • The cibuild.sh script is triggered 
 to run our testsuite
 • It runs: • phplinter • php-cs-fixer • unit tests • integration tests
  34. 34. The cibuild.sh script 34 • cibuild.sh is running unit and functional/integration tests
 • During the tests coverage data is collected
 • Coverage data is send to scrutinizer • If you want to use the testing framework in your extension:
 https://github.com/Nimut/testing-framework …
 UNIT="$TESTING_FRAMEWORK_PATH/res/Configuration/UnitTestsBootstrap.php"
 phpunit -c Build/Test/UnitTests.xml --bootstrap=$UNIT … FUNCTIONAL=„$TESTING_FRAMEWORK_PATH/res/Configuration/FunctionalTestsBootstrap.php“ phpunit -c Build/Test/FunctionalTests.xml--bootstrap=$FUNCTIONAL …
  35. 35. Test output 35 Unit tests in around 10 seconds Integration/Functional tests in 14 Minutes*
 (EXT:solr => TYPO3 => Apache Solr) *improveable but doing all this manually would take us days
  36. 36. 36 Apache Solr for TYPO3: What we achieve and how we continue
  37. 37. 37 What we achieved • Releases EXT:solr/solrfal & solrfluid on 6.4.2017 • 160 pull requests (from 14 contributors) • Features, Bugfixes and Improvements • Integrations of big features are easier • Trends are going into a good direction
  38. 38. 38 …and how we continue • EXT:solr 7.0.0 release (End of July)*: • 8 LTS only • Fluid templating by default • Backendmodules splitted for editors • Multiple plugin instances & 
 custom plugin namespace • Refactored Query API • Bugfixes *only possible with the sponsoring of the EB partners and dkd!
  39. 39. 39 …and how we continue • Roadmap (draft)*: • Q3 Focus: UX Improvements • Grouping Add-on for fluid (EB-only) • Improve default facet widgets • Migrate FE Templates to bootstrap css • Extend index inspector functionality • Q4 Focus: Latest Apache Solr Version • Support Apache Solr 6.x or 7.x • Extract indexing API in EXT:solr • 2018 • Indexing assistent? • Semantic/NReach Support? • Houskeeping :) => TYPO3 9 preparation (doctrine, …) *dependig on the time and buget
  40. 40. 40 NReach & Solr can find more… PoC with EXT:solr / solrfal / nreach-vision • PoC EXT:solr / solrfal + nreach-vision • Build a picture search • Index information added by nreach.io • Objects on pictures • Categories • Dominating colors • …
  41. 41. 41 NReach & Solr can find more… PoC with EXT:solr / solrfal / nreach-vision
  42. 42. 42 NReach & Solr can find more… PoC with EXT:solr / solrfal / nreach-vision
  43. 43. 43 Exited about NReach? • Join the talk from Johnny:
 
 nreach.io - bring semantics inside your TYPO3 installation @ 16:15 • Resources: • http://www.nreach.io/ • https://github.com/nreach • http://nreach-docs.readthedocs.io/en/latest/ Exited?
  44. 44. 44 What you can do? • Become EB partner of EXT:solr and support the open source development
 • Report and fix bugs by creating issues or pull requests on GitHub • Fix a bug or implement a missing feature • Help others in our slack channel (ext-solr): 
 http://typo3.slack.com • Do something for EXT:solr in the coding night :D
  45. 45. Thanks! 45 • To all EB partners (88 in 2017): .hausformat AGENTUR FRONTAG AG amarantus - media design & conding Mario Drengner & Enrico Nemack GbR Amedick & Sommer Neue Medien GmbH Andrea Pausch Animate Agentur für interaktive Medien GmbH artig GmbH & Co. KG b:dreizehn GmbH BIBUS AG Group Bitmotion GmbH cab services ag Causal Sarl Citkomm services GmbH clickstorm GmbH Creative360 cron IT GmbH CYBERhouse Agentur für interaktive Kommukation GmbH data-graphis GmbH Deutscher Ärzteverlag Deutscher Volkshochschul-Verband Die Medialen GmbH die_schnittsteller gmbh Dörfer engineering services E-Magineurs EYE Communications AG Fachhochschule für öffentliche Verwaltung NRW Zentralverwaltung Gelsenkirchen familie redlich AG Fork Unstable Media GmbH hauptsache.net GmbH Havas Düsseldorf GmbH Hirsch & Wölfl GmbH Hochschule Furtwangen - IMZ Online Services Hochschule Konstanz Institut der deutschen Wirtschaft Köln Medien GmbH iresults gmbh ITK Rheinland itl Institut für technische Literatur AG jweiland.net Kassenärztliche Vereinigung Rheinland-Pfalz Kerstin Nägler Web & Social Media Beratung Landesinstitut für Schule und Medien Berlin-Brandenburg Leibniz Universität IT Services Lime Flavour GbR LOUIS INTERNET Maximilian Walter MEDIA:ESSENZ mehrwert intermediäre kommunikation GmbH Mercedes-AMG GmbH mlm media process management GmbH n@work Internet Informationssystems GmbH Netcreators netz-haut GmbH neuwerk interactive Nintendo of Europe GmbH Onedrop Solutions GmbH Paints Multimedia GmbG pixelcreation GmbH plan2net Pluswerk AG polargold GmbH punkt.de GmbH Raiffeisen OnLine GmbH ruhmesmeile GmbH Rundfunk und Telekom Regulierung GmbH Schweizer Alpen-Club SAC sitegeist media solutions GmbH Star Finanz-Software Entwicklung und Vertriebs GmbH Stefan Galinski Internetdienstleistungen Stratis - Toulon Studio 9 GmbH Systime A/S SYZYGY Deutschland GmbH takomat Agentur GbR THE BRETTINGHAMS GmbH TOUMORO Triplesense Reply GmbH Typoheads GmbH Universität Bremen VERDURE Medienteam GmbH WACON Internet GmbH webedit AG Webstore GmbH Webtech AG wegewerk GmbH Wohnungsbau- und Verwaltungsgesellschaft mbH Greifswald XIMA MEDIA GmbH zdreicom GmbH zimmer7 GmbH All previous partners can be found here: http://www.typo3-solr.com/en/sponsors/our-sponsors/
  46. 46. Thanks! 46 • To all contributors (33 since version 6.0.0): Andreas Allacher Andreas Lappe Andriy Oprysko Anjey Arno Schoon Claus Due Daniel Siepmann Dominique Kreemers Felix Eckhofer Frank Nägler Frans Saris Georg Ringer Hannes Lau Hendrik Putzek Ingo Renner Jonas Ulrich Josef Glatz Markus Friedrich Markus Kasten Markus Kobligk Michiel Roos Olivier Dobberkau Patrick Oberdorf Patrick Schriner Peter Kraume Philipp Gampe Pierrick Caillon Rafael Kähm Rasmus Larsen Rémy Daniel Sascha Egerer Thomas Hohn Tomas Norre Mikkelsen
  47. 47. Questions & Answers 47
  48. 48. I am here for you! 48 Timo Hund Email: timo.hund@dkd.de GitHub: https://github.com/timohund Xing: https://www.xing.com/profile/Timo_Hund2 TYPO3 Solr: http://www.typo3-solr.com dkd: http://www.dkd.de/ Twitter: https://twitter.com/dkd_de Facebook: https://www.facebook.com/www.dkd.de Credits: Samuel King Jr, Daniel Horacio Agostini, jbreiti, JD Hancock

×